2009-05-13 13 views
14

Ho guardato JSONPath e anche se sembra abbastanza ben fatto, mi chiedo se qualcuno ha lavorato con esso e può commentare la sua usabilità, o può raccomandare alternative? Che cosa sarebbe davvero slick è se ci fosse un plugin per JQuery che ha fatto qualcosa di simile. Ho cercato i plug-in e sono arrivato a mani vuote. Ad ogni modo, prima di passare il tempo a conoscere JSONPath (che ha alcuni aspetti di cui non sono entusiasta), o prima di reinventare le ruote, ho pensato di vedere se qualcuno avesse un angolo su questo ...JSONPath o altra utilità XPath per JSON/Javascript; o Jquery JSON

Per dare un'idea quello che voglio dire, immaginate questo oggetto 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... 
     } 
    ] 

non sarebbe bello avere a di alcuni degli oggetti più profondi da qualcosa come selettori di jQuery?

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

(Questo può beneficiare di mondi sdolcinato esempio di codice, ma hey, i miei bambini hanno guardato questo. E non è possibile utilizzare vero esempio a causa del NDA ...)

... E, per renderlo più interessante, se dovessi creare una cosa del genere, qualcuno lo userebbe?

+1

L'aggiunta di un tag [json] sembra appropriata. – Tomalak

+0

Definitivamente! Aggiunto ... – jlarson

+0

Interessante domanda. Un equivalente XPath per JSON sarebbe una grande cosa, anche se le implementazioni che ho visto (JSONPath e dojox.json.query) sembrano utilizzare la loro sintassi per qualche motivo che non capisco. – Tomalak

risposta

4

Definitivamente sarebbe un'utilità utile.

La mia opinione è che il modo migliore per avvicinarsi a questo sarebbe rimanere il più possibile simili ai selettori di css, come si indica. Consiglierei di guardare sotto il cofano all'implementazione dei selettori di jquery.

Vorrei suggerire qualcosa di simile

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

al posto dei tuoi esempi di utilizzo.

io non sono sicuro di come l'imminente native json support interesserà questa ...

+0

Sì, passare l'oggetto ha senso. Ho fatto un po 'di hacking in questa scorsa notte e sono incoraggiato dalle possibilità .... altro a venire! – jlarson

+0

Si prega di controllare la mia risposta, ho creato un prototipo – jlarson

2

dojo.getObject del Dojo ha una struttura che funziona vagamente come questo, in cui è possibile fornire un percorso come "abc" al proprietà che si desidera recuperare.

Check it out:

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

Non credo che capisca le matrici piuttosto che bene e penso che manca un linguaggio completo di selezione, come quello che si sta suggerendo.

Per quanto riguarda l'utilizzo, ho codificato un linguaggio di selezione come quello che si sta suggerendo, ma per un client e l'indirizzamento di array è molto proprietario della loro particolare struttura di oggetti.

Vorrei sicuramente utilizzare un sistema come questo se si dovesse fare, e forse anche contribuire se ho visto un'area che potrebbe aiutare con.

+0

Non avevo trovato questo, interessante. Sento SEMPRE il dolore dietro "Utile per catene di api più lunghe in cui devi testare ogni oggetto nella catena", come ho dovuto scrivere molte volte indesiderate come var a = (b? C? D? Bcd: null: null : nullo); [sebbene di solito molto più brutto e includendo altre condizioni]. Tuttavia, questo sembra del tutto insondabile ...OK, sicuramente aggiungendo peso alla creazione di una libreria simile a Jquery parallela per Json/JavascriptObjects, anche se ci saranno ovvie differenze necessarie, e dubito che le prestazioni saranno altrettanto buone ... – jlarson

+0

Per favore controlla la mia risposta, ho creato un prototipo – jlarson

4

OK, ho creato un prototipo per questo, disponibile qui: http://code.google.com/p/jfunk/

Si è già dimostrato utile per me, così ho probabilmente lentamente migliorare e refactoring in qualcosa di bello. Ma se ottengo un buon feedback, posso muovermi più velocemente. Gradirei anche un aiuto.

+0

simpatico. Ho appena dato una rapida occhiata al codice. certamente ha il fulcro dell'idea - potrebbero esserci alcune modifiche per renderlo più efficiente, ma sembra funzionare bene solo ora. Lo guarderò tra una settimana o due quando avrò ancora un po 'di tempo. – cofiem

+0

sì, non ho avuto il tempo di pensare anche all'efficienza-- a parte rendersi conto che DOM ha dei veri vantaggi qui. _but_qualsiasi compito utile potrebbe non essere in grado di essere implementato in modo efficiente in altro modo ... anche se questo potrebbe sostenere la riprogettazione dei dati ... oh, beh, penso che questo sarà utile – jlarson

+0

repository vuoto e nessun cambiamento sin dai primi fase di prototipo? – Qrilka

6

Check out JSON Select - Selettori tipo CSS per JSON.

+0

il link punta a un sito web sbagliato. Dovrebbe essere jsonselect.com? – user152468

+0

@ user152468 Non è più disponibile su jsonselect.org. Ho aggiornato il link per andare al suo repository GitHub. – orad

3

Provare a utilizzare JSPath - https://github.com/dfilatov/jspath.

JSPath è un linguaggio specifico del dominio (DSL) che consente di navigare e trovare i dati all'interno dei documenti JSON. Usando JSPath, puoi selezionare elementi di JSON per recuperare i dati che contengono.

JSPath per JSON come un XPath per XML.

1

Ho appena scritto un client JS-lib che fa proprio questo: consente di interrogare una struttura JSON con XPath.

@jlarson - con "defiant.js", è possibile interrogare la struttura JSON come questo (questo lib estende l'oggetto JSON globale):

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



Questa chiamata restituirà un array con nodi corrispondenti E quelle corrispondenze non verranno rimosse dall'oggetto JSON originale (stesso comportamento di quando si lavora con XML + XPath). Per illustrare quello che voglio dire, qui è un po 'pseudo codice (ish):

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 

Questa lib è finora per il browser e lato client, ma ho intenzione di ri-scrivere per NodeJS alla fine. Controlla qui il valutatore Xpath; questo dimostra la funzionalità. Ci sono anche le espressioni XPath pre-scritto così:

http://defiantjs.com/#xpath_evaluator

È possibile trovare i lib a Github:
https://github.com/hbi99/defiant.js

Infine, c'è un po 'più funzionalità in "defiant.js" e se sei interessato, spero che ne legga laggiù (http://defiant.com)

Spero che lo troverai utile.

Problemi correlati