• DİKKAT !

    Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak Dosya Yükleme tamamen ücretsizdir.

Soru Excel VBA ile Web API'den Gelen İç İçe (Nested) Dinamik JSON Verilerini Dinamik Ayrıştırma

Master

Yeni Üye
Katılım
19 Eki 2021
Mesajlar
92
Aldığı beğeni
34
Katkı
%0.03
Excel V
Office 2003 TR
Konu Sahibi
Selamlar herkese, iyi forumlar. Bir e-ticaret platformunun API'sinden sipariş verilerini VBA (MSXML2.ServerXMLHTTP) ile Excel'e çekiyorum. Buraya kadar sorun yok, ham veri geliyor. Ancak gelen JSON verisi inanılmaz karmaşık ve iç içe geçmiş (nested) durumda. Yani bir sipariş ID'sinin altında 'Kullanıcı Bilgileri', onun altında 'Adres', onun da altında 'Ürünler' listesi var ve her siparişteki ürün sayısı değişken.İnternette satır satır metin kırpan (InStr, Mid kullanarak) basit kodlar buldum ama JSON formatı azıcık değiştiğinde kod patlıyor. Ekli dosyada ham verinin düştüğü alanı ve gitmek istediğim tablo yapısını hazırladım. Harici hiçbir ScriptControl veya DLL referansı eklemeden, tamamen esnek ve dinamik bir biçimde bu iç içe geçmiş JSON düğümlerini otomatik algılayıp Excel sayfasına düzgün bir tablo olarak dökebilecek ileri düzey bir VBA kurgusu yapabilir miyiz? Yardımlarınız için şimdiden çok teşekkürler.
 

Ekli dosyalar

Bu konu benim için de inanılmaz iyi oldu, açan arkadaşın eline sağlık. Biz de şirkette Trendyol ve Hepsiburada API'sinden gelen dataları Excel'e bağlamaya çalışıyoruz ama içeride varyantlar ve adresler işin içine girince JSON çıkarmıyoruz. Harici kütüphane bağlamadan (şirket bilgisayarlarında yetki kısıtı var çünkü) bunu çözebilecek bir hoca çıkarsa valla bizi de büyük dertten kurtarır. Konunun takipçisiyim.
 
Veriler çekildikten sonra aşağıdaki makro işinize yarayabilir.
HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.
 
Konu Sahibi
Selamlar Alicimri Hocam, cevabınız ve emeğiniz için çok teşekkür ederim.
Ancak paylaştığınız kod maalesef bu yapı için oldukça yetersiz kalıyor. TextToColumns ve Replace mantığı sadece düz, tek katmanlı ve sabit metinlerde işe yarayabilir. Benim bahsettiğim senaryoda bir siparişin altında dinamik sayıda "Ürünler" dizisi (Array) var. Yani her siparişteki satır ve derinlik sayısı tamamen değişken. Bu yöntemle ayrıştırma yaptığımda dizi elemanları birbirine giriyor, kolonlar kayıyor ve tablo tamamen çorba oluyor.
Başta da belirttiğim gibi, harici hiçbir DLL (ScriptControl vb.) veya kütüphane referansı eklemeden; gelen JSON metnini karakter karakter tarayarak (tokenization) hafızada dinamik bir Dictionary veya Collection ağacı oluşturacak recursive (öz yinelemeli) bir Pure VBA JSON Parser fonksiyonuna ihtiyacım var. Ancak bu şekilde iç içe geçmiş nesneleri ve değişken dizileri bozmadan, parent-child (üst-alt) ilişkisini koruyarak Excel sayfasına satır satır dökebiliriz.

Şirket bilgisayarlarındaki kısıtlamalardan dolayı diğer arkadaşların da işine yarayacak, tamamen VBA içinde dönen (örneğin VBA-JSON sınıf mantığına benzer ama tek modülde çözülebilecek) daha ileri düzey, nesne tabanlı (Object-Oriented) bir kurgu noktasında yardımlarınızı rica ediyorum. Şimdiden vakit ayıran herkese tekrar teşekkürler.
 
Selamlar Alicimri Hocam, cevabınız ve emeğiniz için çok teşekkür ederim.
Ancak paylaştığınız kod maalesef bu yapı için oldukça yetersiz kalıyor. TextToColumns ve Replace mantığı sadece düz, tek katmanlı ve sabit metinlerde işe yarayabilir. Benim bahsettiğim senaryoda bir siparişin altında dinamik sayıda "Ürünler" dizisi (Array) var. Yani her siparişteki satır ve derinlik sayısı tamamen değişken. Bu yöntemle ayrıştırma yaptığımda dizi elemanları birbirine giriyor, kolonlar kayıyor ve tablo tamamen çorba oluyor.
Başta da belirttiğim gibi, harici hiçbir DLL (ScriptControl vb.) veya kütüphane referansı eklemeden; gelen JSON metnini karakter karakter tarayarak (tokenization) hafızada dinamik bir Dictionary veya Collection ağacı oluşturacak recursive (öz yinelemeli) bir Pure VBA JSON Parser fonksiyonuna ihtiyacım var. Ancak bu şekilde iç içe geçmiş nesneleri ve değişken dizileri bozmadan, parent-child (üst-alt) ilişkisini koruyarak Excel sayfasına satır satır dökebiliriz.

Şirket bilgisayarlarındaki kısıtlamalardan dolayı diğer arkadaşların da işine yarayacak, tamamen VBA içinde dönen (örneğin VBA-JSON sınıf mantığına benzer ama tek modülde çözülebilecek) daha ileri düzey, nesne tabanlı (Object-Oriented) bir kurgu noktasında yardımlarınızı rica ediyorum. Şimdiden vakit ayıran herkese tekrar teşekkürler.
konuyu tam anlamamak ile beraber. aşağıdaki gibi JSONconverter dosyası kullandınız mı. Bunu vba da module kısmına kopyalayın. Jsonconverter içeriğini de Yapay zekayı yapıştırın. yapay zeka ile süreci ilerletin. ben daha önce webten veri çektiğim bir kısım için bu json dönüştürüvü modülünü kullanmıştım.

Bu bağlantı ziyaretçiler için gizlenmiştir. Görmek için lütfen giriş yapın veya üye olun.
bu linkten indirin dosyayı
 
Konu Sahibi
volki_112 Bey selamlar, öneriniz için teşekkürler.
Bahsettiğiniz JsonConverter modülü normalde bu işlerin ilacıdır ama arka planda ScriptControl DLL'lerine veya harici referanslara bağımlı çalışıyor. İlk mesajımda belirttiğim gibi şirket bilgisayarlarındaki IT kısıtlamalarından dolayı bu referansları ekleyemiyoruz ve kod doğrudan hata fırlatıyor.
İşin yapay zeka kısmına gelince; yapay zekaya bu kütüphaneyi verseniz bile iç içe geçmiş (nested) yapılardaki dinamik "Ürünler" dizisini, ana sipariş bilgileriyle eşleştirerek Excel'e satır satır dökmeyi beceremiyor. Döngüleri karıştırıp veriyi yine çorba ediyor.
Bize bu yüzden hiçbir dış kütüphaneye bağımlı olmayan, tamamen VBA'in kendi içinde gömülü nesneleriyle (Collection vb.) metni karakter karakter tarayacak saf bir fonksiyon gerekiyor. İyi niyetiniz ve yönlendirmeniz için çok teşekkür ederim.
 
farklı yapıdaki örnek json dosyaları yükler misiniz.
 
Konu Sahibi
Patron Hocam selamlar, ilgilendiğiniz için çok teşekkür ederim.
Tabii ki, API'den dönen karmaşık ve iç içe geçmiş yapıyı tam olarak yansıtan hayali bir örnek JSON metnini aşağıya ekliyorum.
Bu yapıda gördüğünüz gibi her siparişin (orders) altında bir adet müşteri (customer) ve adres (address) nesnesi varken; her siparişin altındaki ürünler (items) dizisi tamamen dinamik. Örneğin ilk siparişte 2 farklı ürün varken, ikinci siparişte tek ürün var ve bazılarında hediye paketi gibi ekstra alt kırılımlar (meta) bulunabiliyor.
Harici referans veya DLL bağımlılığı olmadan bu hiyerarşiyi bozmadan ayrıştırabilecek kurgunuz için örnek veri


HTML:
Kod:
İçeriği görebilmek için Giriş yap ya da Üye ol.

Bu ham veriyi bozmadan, Excel sayfasına Sipariş ID | Tarih | Müşteri Adı | Şehir | Ürün Adı | Adet | Fiyat şeklinde satır satır açarak dökebilecek Pure VBA çözüm önerilerinizi heyecanla bekliyorum hocam. Şimdiden elinize sağlık.
 
volki_112 Bey selamlar, öneriniz için teşekkürler.
Bahsettiğiniz JsonConverter modülü normalde bu işlerin ilacıdır ama arka planda ScriptControl DLL'lerine veya harici referanslara bağımlı çalışıyor. İlk mesajımda belirttiğim gibi şirket bilgisayarlarındaki IT kısıtlamalarından dolayı bu referansları ekleyemiyoruz ve kod doğrudan hata fırlatıyor.
İşin yapay zeka kısmına gelince; yapay zekaya bu kütüphaneyi verseniz bile iç içe geçmiş (nested) yapılardaki dinamik "Ürünler" dizisini, ana sipariş bilgileriyle eşleştirerek Excel'e satır satır dökmeyi beceremiyor. Döngüleri karıştırıp veriyi yine çorba ediyor.
Bize bu yüzden hiçbir dış kütüphaneye bağımlı olmayan, tamamen VBA'in kendi içinde gömülü nesneleriyle (Collection vb.) metni karakter karakter tarayacak saf bir fonksiyon gerekiyor. İyi niyetiniz ve yönlendirmeniz için çok teşekkür ederim.
jsonconverter dosyası ayrı bir dll değil vba daki bir modül gibi düşünün. vba da modül kısmında import file yazıp json molünü yükleyip deneyiniz. Kendi dosyamda bu şekilde kullanıyorum
Screenshot_190.jpg
 
Konu Sahibi
jsonconverter dosyası ayrı bir dll değil vba daki bir modül gibi düşünün. vba da modül kısmında import file yazıp json molünü yükleyip deneyiniz. Kendi dosyamda bu şekilde kullanıyorum
Ekli dosyayı görüntüle 37179
volki_112 Bey haklısınız, dosya dışarıdan bakıldığında .bas uzantılı bir VBA modülü. Ancak o modülün kod bloğunu açıp incelerseniz, arka planda Windows'un MSScriptControl.ScriptControl nesnesini veya ActiveX bileşenlerini çağırarak JSON metnini ayrıştırdığını görürsünüz.
Yani kod modülün içinde yazılı olsa bile, makro çalıştırdığı an Windows'un sistem dosyalarına (DLL) başvuruyor. Şirket bilgisayarlarındaki güvenlik duvarı (IT Policies) bu arka plan sistem çağrısını zararlı kod/Script engelleme protokolü nedeniyle anında kesiyor. Bireysel bilgisayarlarda harika çalışsa da kurumsal kısıtlı ağlarda maalesef bu yüzden Run-time error verip çöküyor.
 
Geri
Üst