صاحب الموضوع
#1
jq ile iç içe JSON verisini dönüştürme
[jq kullanımı]Bugün iç içe geçmiş JSON yapılarında belirli alanları çıkarıp yeniden yapılandırmak için jq komut satırı aracını nasıl etkili kullanabileceğimizi ele alıyorum. Özellikle derinlikli anahtar adlarına sahip verileri düz bir tabloya dönüştürme, alt nesnelerden gerektiğinde sadece belirli alanları seçme ve istenen çıktı biçimini sabit bir yapıya oturtma konularını derinleştireceğiz.
Sonuç olarak, jq ile iç içe JSON üzerinde güvenli, tekrarlanabilir ve okunabilir dönüşümler yapmak mümkün. Büyük yapıların temelini küçük filtrelerle parçalayabilir ve adımları birleştirerek hedeflediğiniz çıktı biçimini elde edebilirsiniz. Bu konu üzerinde özel bir veri örneği paylaşabilirseniz, hangi alanları hangi şekilde çıkarmak istediğinizi birlikte netleştirelim.
[jq kullanımı]Bugün iç içe geçmiş JSON yapılarında belirli alanları çıkarıp yeniden yapılandırmak için jq komut satırı aracını nasıl etkili kullanabileceğimizi ele alıyorum. Özellikle derinlikli anahtar adlarına sahip verileri düz bir tabloya dönüştürme, alt nesnelerden gerektiğinde sadece belirli alanları seçme ve istenen çıktı biçimini sabit bir yapıya oturtma konularını derinleştireceğiz.
- Temel yapı ve filtre: jq’nin temel akışı, girdiyi alıp filtrelerle dönüşüm yapmaktır. Örneğin { "kullanici": { "id": 42, "ad": "Mehmet", "iletisim": { "eposta": "m@example.com" } } } gibi bir yapıda sadece id ve ad’ı almak için .kullanici | {id, ad} ifadesi kullanılır. Bu basit örnekler gerçek dünyadaki derin iç içe nesneler için temel şablon sağlar.
- Derin iç içe alanları düzleştirme: Elinizde daha karmaşık bir yapı varsa, dolaşım operatörleri ve lib# ile çok katmanlı alanları açıp bir tabloya dökebilirsiniz. Örneğin bir dizi kullanıcıya ait farklı iletişim kanallarını tek satırda toplamak istiyorsanız, map ve add veya join kullanımıyla şu şekilde ilerleyebilirsiniz:
code
jq '.kullanicilar[] | {id: .id, ad: .ad, mail: .iletisim.eposta, telefon: .iletisim.telefon}' input.json
code
Bu örnek, her kullanıcı için temel alanları çıkarmak ve yeni bir yapı oluşturmak için uygun bir başlangıç sağlar.
- Gelişmiş dönüştürmeler: İç içe geçmiş birçok nesne varsa, select-if ve koşullu ifadelerle esneklik elde edebilirsiniz. Örneğin bazı kullanıcılar belirli bir alanı taşımıyor olabilir; bunu şu şekilde güvenli hale getirebilirsiniz:
code
jq '.kullanicilar[] | {id: .id, ad: .ad, eposta: (.iletisim // {}).eposta // "bilinmiyor"}' input.json
code
Burada boş veya eksik alanlar için varsayılan değerler atanır. Ayrıca çok seviyeli dizileri tek bir düzlemde birleştirmek için flatten benzeri yaklaşımlar veya tostring kullanımları uygulanabilir.
- Çıktıyı sabit yapıya oturtma: Sonuçları belirli bir JSON yapısına dönüştürmek için adımları netleştirin ve ihtiyaca göre yeniden adlandırma yapın. Örneğin bir “kullanıcıRaporu” objesi oluşturarak tüm kullanıcıları bir dizi içinde toplayabilir ve her kullanıcıyı sabit alanlarla temsil edebilirsiniz:
code
jq '[ .kullanicilar[] | {id, ad, mail: (.iletisim // {}).eposta, şehir: (.adres?.sehir // "bilinmiyor")} ]' input.json > cikti.json
code
Bu, çıktı yapısının her zaman aynı anahtar setine sahip olmasını sağlar.
Sonuç olarak, jq ile iç içe JSON üzerinde güvenli, tekrarlanabilir ve okunabilir dönüşümler yapmak mümkün. Büyük yapıların temelini küçük filtrelerle parçalayabilir ve adımları birleştirerek hedeflediğiniz çıktı biçimini elde edebilirsiniz. Bu konu üzerinde özel bir veri örneği paylaşabilirseniz, hangi alanları hangi şekilde çıkarmak istediğinizi birlikte netleştirelim.
