Concepts
JSONPath görünüşe eşleşen veya filtreleme amacıyla bir ifadeye keyfi Javascript eklemek sağlayan bir filtre sözdizimi vardır. Ayrıca geçerli düğüm için bir kısayol olarak @
kullanır. Their example bu iki şeyi birleştiren bu gibi görünüyor:
$..book[?(@.price<10)] // filter all
books cheapier than 10
Yani bu burada kullanmak istediğiniz muhtemelen.
Solution
Aklımdaki sorgusu sınamak için, ben JSONPath's repo veri sınamak için jsonpath-test-js.html dosyası değiştirilmiş. Bir HTML dosyası benim örnek yapıştır-kopyala ve sadece bir tarayıcıda yükleyebilirsiniz.
Onların test paketi o
ve p
olarak adlandırılan alanları ile nesnelerin bir dizi var. o
p
o
uygulanacak JSONPath ifadeler bir dizi içerir ise orijinal veri üzerinde işlem içerir. Tüm bu çiftleri üzerinde döngüler ve kendi o
s tüm p
s uygular, sonucu dışarı baskı. Gibi basit bir repl olarak kullanışlı, ama yapacağız değil.
Burada ben ile geldi ne:
<html>
<head>
<title> JSONPath - Tests (js)</title>
<script type="text/javascript" src="http://www.json.org/json.js"></script>
<script type="text/javascript"
src="http://jsonpath.googlecode.com/svn/trunk/src/js/jsonpath.js">
</script>
</head>
<body>
<pre>
<script type="text/javascript">
var out = "", tests =
[ { "o": { "results" : { "div" : [ { "clazz": "sylEntry",
"id": "sylOne", "div": [ { "clazz": "sT", "id": "sOT",
"p": "Mon 11/17, Computer work time" }, { "clazz": "des",
"id": "dOne", "p": "All classes Siebel 0218" } ] } ] } },
"p": ["$.results..div[?(@.clazz=='sT')].p", // my suggestion expression
"$.results..div[*].p"]}, // your question's expression
];
function evaluate($, p) {
var res = eval(p);
return res != null ? res.toJSONString() : null;
}
for (var i=0; i<tests.length; i++) {
var pathes;
for (var j=0; j<tests[i].p.length; j++) {
pre = ">";
if (pathes = jsonPath(tests[i].o, tests[i].p[j], {resultType: "PATH"}))
for (var k=0; k<pathes.length; k++) {
out += pre + " " + pathes[k] +
" = " + evaluate(tests[i].o, pathes[k]) + "\n";
pre = " ";
}
}
out += "<hr/>";
}
document.write(out);
</script>
</pre>
</body>
</html>
Bu ilk benim sorgu ifade sonuçlarını yazdırmak ve sonra senin sonuçlarını yazdırmak, bu yüzden biz ne ürettikleri karşılaştırabilirsiniz unutmayın.
Burada ürettiği çıkış bulunuyor:
> $['results']['div'][0]['div'][0]['p'] = "Mon 11/17, Computer work time"
> $['results']['div'][0]['div'][0]['p'] = "Mon 11/17, Computer work time"
$['results']['div'][0]['div'][4]['p'] = "All classes Siebel 0218"
Yani filtre ifadesinde doğru operatörü olduğu için doğru ifadeyi, yani ==
olduğunu:
$.results..div[?(@.class=='sT')].p
Bu yukarıdaki sorgu sonuçlarında kelime 'sınıf' kullanarak: Ancak, ben bir talihsiz sorunu (en azından JSONPath Javascript uygulamasında) keşfetti:
SyntaxError: jsonPath: Parse error: _v.class=='sT'
Benim tek tahminim bir eval
aslında JSONPath ifadesini değerlendirmek için bir yere çağrıldığını var olmasıdır. class
JavaScript ayrılmış bir sözcüktür, bu yüzden sorunlar neden oluyor. Kullanıcının için alternatif sözdizimi kullanarak deneyelim @.class
:
$.results..div[?(@.['class']=='sT')].p
Sonuçlar:
> $['results']['div'][0]['div'][0]['p'] = "Mon 11/17, Computer work time"
> $['results']['div'][0]['div'][0]['p'] = "Mon 11/17, Computer work time"
$['results']['div'][0]['div'][5]['p'] = "All classes Siebel 0218"
Yani yukarıdaki ifadeyi kullanmak ve gitmek için iyi olmalı! Filtre özelliği güçlü görünüyor, bu yüzden muhtemelen kendi yeteneklerini keşfetmeye değer olacak!