2009-05-13 11 views
14

Patrzyłem na JSONPath i chociaż wydaje się całkiem dobrze zrobione, zastanawiam się, czy ktoś z nim pracował i może wypowiedzieć się na temat jego użyteczności, czy może polecić alternatywy? To, co byłoby naprawdę zręczne, to gdyby była wtyczka do JQuery, która zrobiła coś takiego. Przeszukałem wtyczki i wymyśliłem pustą ręką. W każdym razie, zanim spędzę czas na poznawaniu JSONPath (który ma pewne aspekty, których nie lubię), lub zanim ponownie wymyślę koła, pomyślałem, że zobaczę, czy ktoś ma jakiś kąt w tej kwestii ...JSONPath lub inne narzędzie XPath podobne do JSON/Javascript; lub Jquery JSON

Dać Ci pomysł co mam na myśli, wyobrazić tego obiektu javascript:

var Characters=[ 
     { 
      id: "CuriousGeorge", 
      species:"Monkey", 
      mood: "curious", 
      appendage: [ 
       { 
        type: "hand", 
        side: "left", 
        holding: [ 
         { id: "Banana" } 
        ] 
       }, 
       { 
        type: "hand", 
        side: "right", 
        holding: [] 
       }, 
       { 
        type: "foot", 
        side: "left", 
        holding: [] 
       }, 
       { 
        type: "foot", 
        side: "right", 
        holding: [ 
         { id: "YellowHat" }, 
         { id: "Keys" } 
        ] 
       } 
      ] 
     }, 
     { 
      id: "ManInYellowHat", 
      species: "Human", 
      mood: "angry", 
      //...ok, you get it... 
     } 
    ] 

nie byłoby wspaniale, aby dostać się do niektórych głębszych obiektów przez coś podobnego selektorów jQuery?

var banana=SomeUtility("Characters holding #Banana").get(0); 
var leftHands=SomeUtility("Characters appendage[type=hand][side=left]").get(); 

(To może kwalifikować się do światów corniest przykład kodu, ale hej, moje dzieci po prostu oglądaliśmy to. I nie można używać prawdziwy przykład z powodu NDA ...)

... A, aby było ciekawiej, gdybym miał stworzyć coś takiego, czy ktoś by z tego skorzystał?

+1

Dodanie znacznika [json] wydaje się odpowiednie. – Tomalak

+0

Zdecydowanie! Dodano ... – jlarson

+0

Interesujące pytanie. Odpowiednik XPath dla JSON byłby świetny, chociaż implementacje, które oglądałem (JSONPath i dojox.json.query) wydają się używać swojej własnej składni z jakiegoś powodu, którego nie rozumiem. – Tomalak

Odpowiedz

4

Zdecydowanie byłby użytecznym narzędziem.

Moja opinia jest taka, że ​​najlepszym sposobem, aby się do tego podejść, jest zachowanie jak największego zbliżenia do selektorów css, jak wskazano. Polecam, patrząc pod maską na implementację selektorów jquery.

chciałbym zaproponować coś podobnego

var banana = object.function(jsonObect, "holding #Banana"); 
var leftHands = object.function(jsonObject, "appendage[type=hand][side=left]"); 

zamiast swoimi przykładami ich użycia.

Nie jestem pewien, jak nadchodząca native json support wpłynie to ...

+0

Tak, przekazanie obiektu będzie miało sens. Zrobiłem trochę hackowania tej ostatniej nocy i jestem zachęcany przez możliwości .... jeszcze przed nami! – jlarson

+0

Proszę sprawdź moją odpowiedź, Stworzyłem prototyp – jlarson

2

dojo za dojo.getObject posiada funkcję, która działa luźno jak ten, w którym można podać ścieżkę jak „abc” do właściwość, którą chcesz pobrać.

Sprawdź:

http://api.dojotoolkit.org/jsdoc/1.3/dojo.getObject

Nie sądzę, że rozumie, że tablice całkiem dobrze i myślę, że brakuje w pełni funkcjonalny język wyboru takiego samego, jak sugeruje.

Jeśli chodzi o użycie, zakodowałem język wybierania, taki jak sugerowany, ale dla klienta i adresowanie tablic jest bardzo zastrzeżone dla ich struktury obiektu.

Byłbym zdecydowanie użyć takiego systemu, jeśli miałbyś go zrobić, a może nawet przyczynić się, gdy zobaczyłem obszar, w którym mogłem pomóc.

+0

Nie znalazłem tego, interesującego. ZDECYDOWANIE odczuwam ból za "Przydatny dla dłuższych łańcuchów api, w których musisz testować każdy obiekt w łańcuchu", ponieważ wielokrotnie musiałem pisać śmieci takie jak var a = (b? C? D? Bcd: null: null : zero); [choć zwykle dużo brzydsza i zawierająca inne warunki]. Mimo wszystko wydaje się to ogólnie rozczarowujące ...OK, zdecydowanie dodając wagi do tworzenia równoległej biblioteki Jquery do Json/JavaScriptObjects, choć będą oczywiste niezbędne różnice i wątpię, aby wydajność była równie dobra ... – jlarson

+0

Proszę sprawdź moją odpowiedź, Stworzyłem prototyp – jlarson

4

OK, stworzyli prototyp tego, dostępnego tutaj: http://code.google.com/p/jfunk/

To już sprawdzoną użyteczne dla mnie, więc prawdopodobnie będzie powoli poprawić i byłaby go w coś miłego. Ale jeśli dostanę dobre opinie, mogę poruszać się szybciej. Chciałbym także powitać pomoc.

+0

miły. Po prostu rzuciłem okiem na kod. na pewno wpadł na sedno pomysłu - może być kilka możliwych usprawnień, które sprawią, że będzie on bardziej wydajny, ale wydaje się, że teraz działa dobrze. Popatrzę na to za tydzień lub dwa, kiedy będę mieć więcej czasu. – cofiem

+0

Tak, nie miałem czasu nawet pomyśleć o efektywności - poza tym, że zdajemy sobie sprawę, że DOM ma tutaj pewne zalety. _but_ wszelkie zadania, które są użyteczne, mogą nie być wydajnie implementowane w inny sposób ... chociaż to by przemawiało za przeprojektowaniem danych ... no cóż, myślę, że to będzie przydatne – jlarson

+0

puste repo i żadnych zmian od wczesnego etap prototypu? – Qrilka

6

Sprawdź JSON Select - selektory podobne do CSS dla JSON.

+0

link wskazuje na złą stronę. Czy powinien to być jsonselect.com? – user152468

+0

@ user152468 Nie jest już dostępny na jsonselect.org. Zaktualizowałem link, aby przejść do repozytorium GitHub. – orad

3

Spróbuj użyć JSPath - https://github.com/dfilatov/jspath.

JSPath to język specyficzny dla domeny (DSL), który umożliwia nawigację i wyszukiwanie danych w dokumentach JSON. Korzystając z JSPath, możesz wybrać elementy JSON, aby pobrać zawarte w nich dane.

JSPath dla JSON podobnie jak XPath dla XML.

1

Właśnie napisałem klienta JS-lib, który robi właśnie to - umożliwia zapytanie o strukturę JSON z XPath.

@jlarson - z "defiant.js", można wyszukać swoją strukturę JSON tak (to lib rozszerza globalny obiekt JSON):

JSON.search(Characters, '//*[id="Banana"]'); 



To wywołanie zwróci tablica z pasującymi węzłami I te dopasowania nie zostaną odłączone od oryginalnego obiektu JSON (takie samo zachowanie, jak podczas pracy z XML + XPath). Aby zilustrować, co mam na myśli, tutaj jest trochę pseudo (-ish) Kod:

var store = { 
    "book": [ 
     { 
      "id": 1, 
      "price": 8.95, 
      "title": "Sayings of the Century", 
      "category": "reference", 
      "author": "Nigel Rees" 
     }, 
     { 
      "id": 2, 
      "price": 22.99, 
      "title": "The Lord of the Rings", 
      "category": "fiction", 
      "author": "J. R. R. Tolkien", 
      "isbn": "0-395-19395-8" 
     } 
    ] 
}; 

var b1 = JSON.search(store, '//book[1]'); 
b1[0].isbn = '12345'; 

console.log(store.book[0].isbn); 
// 12345 

Ten lib jest tak daleko do przeglądarki i stronie klienta, ale mam plany, aby ponownie zapisać go na NodeJS ostatecznie. Sprawdź tutaj ewaluatora Xpath; to demonstruje funkcjonalność. Istnieją również pre-napisany wyrażeń XPath, a także:

http://defiantjs.com/#xpath_evaluator

można znaleźć lib na Github:
https://github.com/hbi99/defiant.js

Wreszcie jest trochę więcej w "funkcjonalność" oraz defiant.js Jeśli jesteś zainteresowany, możesz mieć nadzieję, że przeczytasz tam (http://defiant.com)

Mam nadzieję, że okaże się to przydatne.