Yalnızca belirli bir değer alır, böylece JSONpath ifade Craft?

2 Cevap php

Aşağıdaki küçük bir örnek olduğu bazı JSON vardır:

results": {
"div": [
{
 "class": "sylEntry",
 "id": "sylOne",
 "div": [
  {
   "class": "sT",
   "id": "sOT",
   "p": "Mon 11/17, Computer work time"
  },
  {
   "class": "des",
   "id": "dOne",
   "p": "All classes Siebel 0218"
  }
 ]
},

Ben tek sınıf "sT" ile div öğesi için "p" içeriği almak istiyorum. Ben bir döngü ve böyle bir şey yaptığını kullanmak istiyorum:

var arrayOfResults = $.results..div.p 

Ben sadece sınıf ile div öğesi için p değerini almak istiyorum çünkü çalışmıyor "sT".

Bu divs sınıf "sT" içinde bulunan p elemanlarının dizi alınamadı böylece Peki nasıl benim JSONpath inşa yok.

Teşekkürler!

2 Cevap

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!

Eğer JSON yapıları sorgulamak hangi ile yerine - hard-to-kavramak, standart dışı sorgu tarzı kullanarak, sen "arama" yöntemi ile küresel nesneyi JSON uzanan, (http://defiantjs.com) DefiantJS kullanabilirsiniz standardize XPath sorguları. (Hiçbir sonuç bulunamadı eğer boş bir dizidir) Bu yöntem, bir dizide eşleşme döndürür.

Here is a working JSfiddle of the code below;
http://jsfiddle.net/hbi99/sy2bb/

var data = {
       "results": {
          "div": {
             "class": "sylEntry",
             "id": "sylOne",
             "div": [
                {
                   "class": "sT",
                   "id": "sOT",
                   "p": "Mon 11/17, Computer work time"
                },
                {
                   "class": "des",
                   "id": "dOne",
                   "p": "All classes Siebel 0218"
                }
             ]
          }
       }
    },
    res = JSON.search( data, '//div[class="sT"]/p' );

console.log( res[0] );
// Mon 11/17, Computer work time

To get an idea of XPath and how it works, check out this XPath Evaluator tool:
http://defiantjs.com/#xpath_evaluator