JSONPath nedir?
JSONPath, JSON belgeleri için XML'deki XPath'in JSON karşılığı olan bir sorgu dilidir. Stefan Goessner, 2007'de ayrıştırıcı yazmadan bir JSON ağacındaki bir düğümü göstermenin kısa ve okunabilir bir yolu olarak önerdi. Bir deyim kök seçiciyle ($) başlar ve istediğiniz düğümleri seçene kadar özellik erişimcilerini, dizi alt simgelerini, joker karakterleri, özyinelemeli inişi ve filtre koşullarını zincirler. 2024'te IETF, uygulamalar arasında parçalanan sözdizimini standartlaştırmak için RFC 9535'i yayımladı; bu test aracı, Goessner taslağını, RFC 9535'in büyük bölümünü ve birkaç ek uzantı operatörünü destekleyen yaygın kullanımlı bir JavaScript uygulaması olan jsonpath-plus üzerinde çalışır.
JSONPath nasıl çalışır?
Bir JSONPath deyimi soldan sağa okunur ve bir JSON belgesini bir seferde bir adım yürür. Her adım, önceki adımdan kurtulan düğüm kümesini alır ve onu daha da daraltır. Tam değerlendirme hattı:
- Kök seçiciyle (
$) demirleyin. Her deyim burada başlar ve ister nesne ister dizi olsun en üst düzey değeri işaret eder. Baştaki$olmayan yalın özellik adları geçerli JSONPath değildir. - Alt üyelere nokta gösterimiyle (
$.store.book) veya köşeli parantez gösterimiyle ($['store']['book']) girin. Köşeli parantez gösterimi, bir anahtarın boşluk, kısa çizgi veya geçerli bir tanımlayıcı olmayan herhangi bir karakter içermesi durumunda zorunludur. - Özyinelemeli iniş operatörüyle (
..) her seviyede aynı anda arayın.$..authordeyimi, derinlikten bağımsız olarak ağaçtaki herauthordeğerini toplar. Bu, JMESPath'in sahip olmadığı operatördür. - Dizi öğelerini indeksle seçin (
[0],[-1]jsonpath-plus'ta son öğe için),[start:end]gösterimiyle dilimleyin ([0:3]ilk üçü döndürür) veya joker[*]ile her öğeyi alın. [?(...)]içindeki bir yüklemle öğeleri filtreleyin. Yüklemin içinde@geçerli öğeye atıfta bulunur; dolayısıyla[?(@.price<10)]yalnızcapricealanı 10'dan az olan öğeleri tutar. Filtreler yolun geri kalanıyla bileşir; dolayısıyla filtreleyip inebilir veya inip filtreleyebilirsiniz.- Çıktı biçimini seçin. Değerler, eşleşen verinin kendisini döndürür. Yollar, motorun ne çözümlediğini görebilmeniz için her eşleşmenin JSONPath'ini döndürür. İşaretçiler, her eşleşme için eşdeğer RFC 6901 JSON İşaretçisini döndürür; aşağı akış tüketicisi JSON Patch veya bir JSON Şema doğrulayıcısı olduğunda kullanışlıdır.
Bu JSONPath test aracını neden kullanmalısınız?
- JSON'unuz tarayıcıyı asla terk etmez. Sorgu sayfanın içinde çalışır; dolayısıyla prodüksiyon fikstürleri, müşteri PII ve ön yayım API yanıtları makinenizde kalır.
- Motor, birçok prodüksiyon test paketini ve CI onaylamasını destekleyen aynı kütüphane olan
jsonpath-plus9.x sürümüdür. Burada gördüğünüz sonuçlar, derleme hattınızın göreceği sonuçlarla eşleşir. - Üç çıktı modu, yaygın aşağı akış tüketicilerini kapsar: yapıştır-kopyala için ham Değerler, motorun çözümlemesini hata ayıklamak için Yollar ve JSON Patch ve JSON Şema iş akışları için RFC 6901 İşaretçileri.
- Filtre deyimleri
preventEval: trueile çalışır; dolayısıyla yapıştırılan bir sorgu ana sayfaya karşı keyfi JavaScript çalıştıramaz. Bu, deyim bir Slack mesajından, Jira biletinden veya bir meslektaşın panosundan geldiğinde önem kazanır.
JSONPath'in yaygın uygulamaları
JSONPath, kodun elle özyinelemeli iniş yazmadan bir JSON yükünden bir alan çekmesi gereken her yerde karşımıza çıkar:
- Postman testleri: Postman'daki Tests sekmesi, onaylamalar için JSONPath stili erişimle birlikte
pm.response.json()'u ortaya koyar. Ekipler, CI'da bir yanıttan alan çekmek ve onu onaylamak için$.data.user.emailgibi tek bir deyim yazar. - k6 yük testleri: k6 betikleri, yanıt gövdelerinden değer çıkarmak ve bir
check()bloğu içinde SLA eşiklerini onaylamak içinjsonpath()çağırır. Postman'da bir sözleşmeyi kanıtlayan aynı deyim, k6 altında bir yük testini kapıya alabilir. - Veri dönüşümleri için JSON DSL: AWS Step Functions, durumlar arasındaki olay yüklerini yeniden şekillendirmek için
InputPath,ResultPathveParametersiçinde JSONPath değerlendirir. Argo Workflows, bir dizi üzerinde görevleri genişletmek içinwithParam'da JSONPath kullanır. Kuberneteskubectl -o jsonpath, küme nesnelerinden alan çıkarmak için aynı sözdizimini kullanır.
Uygulamalı örnek
Kanonik Goessner fikstürü, her biri category, author, title ve price taşıyan dört kitabı olan kitap mağazası belgesidir. Bu fikstüre karşı $.store.book[?(@.price<10)].title deyimi üç adımda çalışır. Önce $.store.book tüm dört kitabın dizisine çözümlenir. Ardından filtre [?(@.price<10)] yalnızca 10'un altındaki fiyatlı kitabı tutar (8.95'teki giriş). Son olarak .title o kitabın başlığını çıkarır. Sonuç ["Sayings of the Century"]'dir. Yollar'a geçmek ["$['store']['book'][0]['title']"] döndürür; İşaretçiler ise ["/store/book/0/title"] döndürür.
Deyimlerinizi burada prototip yapın, ardından doğrudan Postman'a, k6'ya, kubectl'e veya bir Step Functions durum makinesine bırakın. Yapıştırın, sorgulayın, kopyalayın. Ağı hiçbir şey geçmez.
JSONPath nedir?
JSONPath, XML için XPath'e benzer şekilde JSON belgeleri için bir sorgu dilidir. Stefan Goessner tarafından 2007'de önerilmiş ve 2024'te IETF tarafından RFC 9535 olarak standartlaştırılmıştır. $ (belge kökü) ile başlayan kompakt bir ifade sözdizimi kullanır ve bir JSON ağacındaki düğümleri seçmek için nokta gösterimi, dizi alt simgeleri, joker karakterler, dilimler, özyinelemeli iniş (..) ve filtre deyimlerini ([?(...)]) destekler.
JSONPath, JMESPath veya jq'dan nasıl farklıdır?
Üçü de JSON'u sorgular ancak dilbilgisi ve hedefleri farklıdır. JMESPath, AWS CLI / SDK standardıdır: JSONPath'ten daha katı, özyinelemeli iniş yok, öngörülebilir yan-etkisiz projeksiyon için tasarlandı. jq, JSON'u yalnızca sorgulamakla kalmayıp dönüştüren, azaltan ve akışa alan Turing-tamamlı bir betik dilidir. JSONPath ikisi arasında yer alır: özyinelemeli iniş ve filtreler sayesinde JMESPath'ten daha ifadeli, jq'dan daha hafif ve genel amaçlı test araçlarında (Postman, Playwright, REST Assured, kubectl, Step Functions) en yaygın desteklenen sözdizimi. Bu test aracı JSONPath uygular.
Bu test aracı hangi lehçeyi kullanır?
Bu test aracı jsonpath-plus 9.x sürümünü çalıştırır. Bu kütüphane Goessner 2007 spec'ini uygular, RFC 9535'in büyük bölümünü kapsar ve tür denetimleri (@.string(), @.number(), @.boolean()) ve üst gezinme (^) gibi uzantı operatörleri ekler. preventEval: true bayrağı her zaman ayarlanmıştır; bu nedenle filtre yüklemleri JavaScript eval() yerleşiği yerine güvenli bir yorumlayıcı aracılığıyla çalışır. Yapıştırılan bir sorgu bu sayfaya karşı keyfi kod çalıştıramaz.
Eşleşen değerleri tek tek kopyalayabilir miyim?
Evet. Panoya kopyala düğmesi tam sonuç bloğunu JSON dizisi olarak kopyalar. Tek bir değer almak için çıktı modunu Değerler'e geçirin, ardından sonuç metin alanında istediğiniz satırı seçin ve tarayıcınızın normal kopyalama kısayolunu kullanın (Ctrl/Cmd + C). Çıktı düz JSON metnidir; dolayısıyla bir kod düzenleyiciye, terminale, Postman testine veya Slack mesajına temiz yapıştırılır.