XQuery / XPath'ın JSON eşdeğeri var mı?


221

Karmaşık JSON dizileri ve karma değerlerindeki öğeleri ararken, örneğin:

[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [
            // etc.
        }]
    }
]

Bir öğeyi bulmak için kullanabileceğim bir tür sorgu dili var mı in [0].objects where id = 3?


bir tane yapmadıkça değil. Sorguyu sunucuda bırakın ve yalnızca gereksinim duyduğunuz verileri almak için REST'i kullanın.
52'de

5
+1 iyi fikir. Bunu yarın yazacağım…

2
XPath değil, ama JLinq oldukça iyi buldum (bu kodu okumak gibi yapar in(...).where(...).select(...)): hugoware.net/Projects/jLinq .
pimvdb

4
Bu çok sinir bozucu çünkü orada çok sayıda kütüphane var ama yaygın olarak kabul gören bir standarda yaklaşan hiçbir şey yok. Üçüncü taraflarca kullanılan bir kütüphanemiz var, bu yüzden yaygın olarak bilinen ve kullanılan bir sorgu dili sağlamalıyız.
David Thielen

1
Elbette jsel - github.com/dragonworx/jsel - kullanabilirsiniz data, JSON nesnenizi içeren bir değişkeniniz varsa, şunu yazarsınız: jsel(data).select("//*[@id=3]")3 ile id anahtarını içeren nesneyi döndürür.
Ali

Yanıtlar:


122

Evet, buna JSONPath deniyor . Kaynak şimdi GitHub'da .

Ayrıca DOJO'ya da entegre edilmiştir .


3
Brian'ın cevabı, dojo'daki jsonPath modülü yerine jsonQuery modülünün kullanılması gerektiğini gösteriyor .
hugomg

5
Bu ne kadar sağlam? Ve bizim için bir anlaşma katil Java veya C # sürümünü bulamıyorum.
David Thielen

2
Buraya bağlanan site Javascript ve PHP sağlar. Bir Java uygulamasına ihtiyacınız varsa, burada bir tane vardır: code.google.com/p/json-path
Matthias Ronge

2
Ben JSONPath XPath resmi semantik dayalı olmadığını belirtmek gerekir. JSONiq daha iyi bir seçenek olabilir.
wcandillon

1
@Paramaeleon Harika çalışıyor. Bu arada proje GitHub'a taşındı . Mike bunu cevaba eklemek isteyebilir, çünkü insanlar bu konuda yorum yapmaya devam ediyor.
Franklin Yu

21

Ben JSONQuery JSONPath bir üst küme olduğunu ve bu nedenle dojo yerine geçer . Bir de RQL var .

Dojo belgelerinden:

JSONQuery, JSONPath'ın güvenlik, kullanım kolaylığı ve joker karakter dizisi karşılaştırmaları ve çeşitli operatörlerle esnek ifadeler dahil olmak üzere kapsamlı bir veri sorgulama araçları seti içeren genişletilmiş bir JSONPath sürümüdür.

JSONselect'in soru üzerinde başka bir bakış açısı var (XPath yerine CSS seçici benzeri) ve bir JavaScript uygulaması var .


4
Github JSONQuery bağlantısı ölü gibi görünüyor. JSONSelect ayrıca bir JavaScript sürümüne sahip.
Henrik Aasted Sørensen

19

Farkında olduğum diğer alternatifler

  1. İki dil alt türünü belirten JSONiq belirtimi: biri XML ayrıntılarını gizleyen ve JS benzeri sözdizimi sağlayan, diğeri de XQuery sözdizimini JSON yapıcıları ve benzerleriyle zenginleştiren. Zorba JSONiq'i uygular.
  2. MarkLogic'in üzerine kurulan Corona , XML, JSON, Metin ve İkili içeriği depolamak, yönetmek ve aramak için bir REST arayüzü sağlar.
  3. MarkLogic 6 ve üstü, kutudan çıkar çıkmaz Corona ile benzer bir REST arayüzü sağlar.
  4. MarkLogic 8 ve üstü, JSON'u hem XQuery hem de Sunucu tarafı JavaScript ortamlarında yerel olarak destekler. Üzerine XPath uygulayabilirsiniz.

HTH.


3
Şimdi bir JSONiq uygulaması var: Zorba 2.6 resmi olarak destekliyor.
Ghislain Fourny

Not: MarkLogic, JSON'u sürüm 8 itibariyle yerel olarak depolar ve XPath'ın doğrudan uygulanmasına izin verir.
grtjn

18

JSON verilerinin geçişi / filtrelemesi için mevcut seçeneklerden bazılarını özetlemek ve bazı sözdizimi örnekleri sunmak için ...

  • JSPath
    .automobiles{.maker === "Honda" && .year > 2009}.model

  • json: select () (CSS seçicilerinden daha fazla esinlenerek)
    .automobiles .maker:val("Honda") .model

  • JSONPath (XPath'tan daha çok esinlenmiştir)
    $.automobiles[?(@.maker='Honda')].model

Bence JSPath en güzel görünüyor, bu yüzden onu AngularJS + CakePHP uygulamasıyla entegre etmeye çalışacağım.

(Aslında bu cevabı başka bir başlıkta yayınladım, ancak burada da yararlı olacağını düşündüm.)


CSS seçicilerinde veya XPath'ta bulunan ilhamdan bahsettiği için harika özet ve örnekler.
Jochem Schulenklopper

13

JSPath'i kullanmayı deneyin

JSPath, JSON belgelerinizde veri bulmanıza ve bulmanıza olanak tanıyan, etki alanına özgü bir dildir (DSL). JSPath'i kullanarak, içerdikleri verileri almak için JSON öğelerini seçebilirsiniz.

XML için XPath gibi JSON için JSPath.

Hem Node.js hem de modern tarayıcılar için büyük ölçüde optimize edilmiştir.


9

XQuery, işlemcinin JSON desteği sunması koşuluyla JSON'u sorgulamak için kullanılabilir. Bu, BaseX'in "id" = 1 olan nesneleri bulmak için nasıl kullanılabileceğinin açık bir örneğidir:

json:parse('[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [ "etc." ] }
    ]}
]')//value[.//id = 1]

(6 yıl sonra) Saxon, JSON'u sorgulayan XQuery 3.1'i çalıştıracak. Saxon deneyimim java tarafından çalıştırılan jar dosyasını kullanıyor. Saxon-java adında bir düğüm modülü var ama bunun nasıl çalıştığını w / json emin değilim. Ve Saxonica'dan Saxon-JS adında yeni bir şey daha var.
charles ross

9

Bir çeşit sorgulama dili var mı?

jq , JSONPath'e çok benzeyen bir J SON q uery dili tanımlar - bkz. https://github.com/stedolan/jq/wiki/For-JSONPath-users

... [hangi] [0] .objects içinde id = 3 nerede bir öğe bulmak için kullanılabilir?

Bunun anlamı varsayalım: Nesne nerede olursa olsun, id == 3 ile belirtilen anahtarın altındaki tüm JSON nesnelerini bulun. Karşılık gelen bir jq sorgusu:

.[0].objects | .. | objects | select(.id==3)

burada "|" boru operatörüdür (komut kabuğu borularında olduğu gibi) ve ".. | nesneleri" segmenti "nesnenin nerede olursa olsun" karşılık gelir.

Jq'nin temelleri büyük ölçüde açık veya sezgisel veya en azından oldukça basittir ve komut kabuğu borularına aşina iseniz geri kalanların çoğunu almak kolaydır. Jq SSS öğreticiler ve benzerleri için işaretçiler vardır.

jq işlemci CRUD işlemlerini desteklediği için SQL gibidir, ancak jq işlemci hiçbir zaman girdisinin üzerine yazmaz. jq ayrıca JSON varlıklarının akışlarını da işleyebilir.

JSON yönelimli bir sorgu dilini değerlendirirken göz önünde bulundurmak isteyebileceğiniz diğer iki kriter şunlardır:

  • düzenli ifadeleri destekliyor mu? (jq 1.5, PCRE normal ifadesi için kapsamlı desteğe sahiptir)
  • Tamamlandı mı? (Evet)

8

Defiant.js de oldukça havalı görünüyor, basit bir örnek:

var obj = {
        "car": [
            {"id": 10, "color": "silver", "name": "Volvo"},
            {"id": 11, "color": "red",    "name": "Saab"},
            {"id": 12, "color": "red",    "name": "Peugeot"},
            {"id": 13, "color": "yellow", "name": "Porsche"}
        ],
        "bike": [
            {"id": 20, "color": "black", "name": "Cannondale"},
            {"id": 21, "color": "red",   "name": "Shimano"}
        ]
    },
    search = JSON.search(obj, '//car[color="yellow"]/name');

console.log( search );
// ["Porsche"]

var reds = JSON.search(obj, '//*[color="red"]');

for (var i=0; i<reds.length; i++) {
    console.log( reds[i].name );
}
// Saab
// Peugeot
// Shimano

Ne yazık ki, şu anda npm'de yayınlanmadı ve manuel kurulum gerektiriyor ...
Andrew Mao


7

Jsel harika ve gerçek bir XPath motoruna dayanıyor. Yalnızca nesneleri (dizeleri de) değil, her türlü JavaScript verisini bulmak için XPath ifadeleri oluşturmanıza olanak tanır.

Verilerinizin XPath motoru tarafından nasıl yürünebileceği üzerinde tam kontrol sahibi olmak için özel şemalar ve eşlemeler oluşturabilirsiniz. Şema, öğelerinizde, alt öğelerin, özniteliklerin ve düğüm değerlerinin verilerinizde nasıl tanımlandığını tanımlamanın bir yoludur. O zaman kendi ifadelerinizi oluşturabilirsiniz.

dataSorgudaki JSON'u içeren bir değişkeniniz olduğu düşünüldüğünde, yazmak için jsel kullanabilirsiniz:

jsel(data).select("//*[@id=3]")

Bu id, 3 özniteliğine sahip herhangi bir düğümü döndürür. Öznitelik, bir nesne içindeki herhangi bir ilkel (dize, sayı, tarih, normal ifade) değeridir.


6

ObjectPath , XPath veya JSONPath'e benzer bir sorgu dilidir, ancak katıştırılmış aritmetik hesaplamalar, karşılaştırma mekanizmaları ve yerleşik işlevler sayesinde çok daha güçlüdür. Sözdizimine bakın:

Dükkanda bul tüm ayakkabı kırmızı renk ve fiyat az 50

$ .. ayakkabı. * [renk "kırmızı" ve fiyatı <50]


Web sitesindeki ilk örneği beğendim ve ObjectPath'in etkileşim, kabuk benzeri bir modda çalıştırılabilmesi harika, ancak aradığım şey ObjectPath'i bir Python betiğinde kullanmaktır. Beni ObjectPath'in kitaplık olarak nasıl kullanılacağını gösteren bir örneğe yönlendirebilir misiniz? Web sitesinde böyle bir şey bulamıyorum.
piokuc

Lütfen github'da Python kullanımı ile ilgili bölüme bakınız . Bunu web sitesine ekleyeceğiz - şu anda bulmak gerçekten zor. Daha fazla yardıma ihtiyacınız olursa, google grubuna bir soru gönderebilirsiniz .
Ela Bednarek

Teşekkür ederim Ela, github sayfasına eklenen örnekler tam olarak ihtiyaç duyulan şeydir.
piokuc


3

JMESPath bugünlerde çok popüler gibi görünüyor (2020 itibariyle) ve JSONPath ile ilgili bir dizi sorunu ele alıyor. Birçok dilde kullanılabilir.


1

Eğer benim gibiyseniz ve sadece yol tabanlı arama yapmak istiyorsanız, ancak gerçek XPath'i umursamıyorsanız, lodash'lar _.get()işe yarayabilir. Lodash dokümanlarından bir örnek:

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// → 3

_.get(object, ['a', '0', 'b', 'c']);
// → 3

_.get(object, 'a.b.c', 'default');
// → 'default'

Ne yazık ki bu işlev yalnızca tek bir sonuç döndürebilir, diğer kütüphanelerin parladığı bir dizi eşleşen öğenin getirilmesini desteklemez.
Simon East

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.