2009-05-13 7 views
14

He estado buscando en JSONPath y aunque parece bastante bien hecho, me pregunto si alguien ha trabajado con él y puede comentar sobre su usabilidad, o puede recomendar alternativas. Lo que sería realmente pulido es si había un complemento para JQuery que hizo algo como esto. He estado buscando los complementos y estoy llegando con las manos vacías. De todos modos, antes de pasar el tiempo conociendo JSONPath (que tiene algunos aspectos que no me entusiasman), o antes de reinventar las ruedas, pensé que vería si alguien tuviera un ángulo en esto ...JSONPath u otra utilidad similar a XPath para JSON/Javascript; o Jquery JSON

Dar usted una idea de lo que quiero decir, imagina este objeto 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... 
     } 
    ] 

¿no sería grande conseguir a algunos de los objetos más profundos por algo así como selectores Jquery?

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

(Esto puede calificar para mundos ejemplo de código cursi, pero bueno, mis hijos sólo vimos esto. Y no puede utilizar ejemplo real debido a la NDA ...)

... Y, para hacerlo más interesante, si tuviera que crear tal cosa, ¿alguien lo usaría?

+1

Agregar una etiqueta [json] parece apropiado. – Tomalak

+0

¡Definitivamente! Agregado ... – jlarson

+0

Pregunta interesante. Un equivalente de XPath para JSON sería una gran cosa, aunque las implementaciones que examiné (JSONPath y dojox.json.query) parecen usar su propia sintaxis por algún motivo que no entiendo. – Tomalak

Respuesta

4

Definitivamente sería una utilidad útil.

Mi opinión es que la mejor manera de abordar esto sería permanecer lo más similar posible a los selectores CSS, como usted indica. Yo recomendaría buscar bajo el capó en la implementación de selectores de jquery.

Yo sugeriría algo así como

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

en lugar de sus ejemplos de uso.

No estoy seguro de cómo la próxima native json support afectará esto ...

+0

Sí, pasar el objeto tendrá sentido. Hice algo de piratería en esta última noche y me alientan las posibilidades ... ¡más por venir! – jlarson

+0

Por favor, mira mi respuesta, he creado un prototipo – jlarson

2

dojo.getObject de Dojo tiene una instalación que funciona sin apretar como este, donde se puede proporcionar una ruta como "abc" a la propiedad que desea buscar

Compruébelo usted mismo:

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

No creo que se entiende que las matrices bastante bien y creo que le falta un selector de idioma completo como el que usted está sugiriendo.

En cuanto al uso, he codificado un lenguaje selector como el que está sugiriendo, pero para un cliente, y el direccionamiento de matriz es muy propio de su estructura de objeto particular.

Definiría definitivamente usar un sistema como este si fuera a hacerlo, y tal vez incluso contribuir si veía un área con la que podría ayudar.

+0

No había encontrado este, interesante. Definitivamente siento el dolor detrás "Útil para cadenas de API más largas donde tienes que probar cada objeto en la cadena", ya que muchas veces he tenido que escribir basura como var a = (b? C? D? Bcd: null: null : nulo); [aunque usualmente es mucho más feo e incluye otras condiciones]. Aún así, esto parece decepcionante en general ...OK, definitivamente agregando peso a la creación de una biblioteca paralela tipo Jquery para Json/JavascriptObjects, aunque habrá diferencias obvias necesarias, y dudo que el rendimiento sea tan bueno ... – jlarson

+0

Por favor revisa mi respuesta, he creado un prototipo – jlarson

4

OK, he creado un prototipo para esto, disponible aquí: http://code.google.com/p/jfunk/

Ya ha demostrado ser útil para mí, así que es probable que poco a poco mejorar y refactorizar en algo agradable. Pero si recibo buenos comentarios, puedo moverme más rápido. También me gustaría recibir ayuda.

+0

bonito. Acabo de echar un rápido vistazo al código. Sin dudas, el núcleo de la idea está ahí: podrían hacerse algunos ajustes para hacerlo más eficiente, pero parece funcionar bien ahora. Lo echaré un vistazo en una semana o dos cuando tenga más tiempo. – cofiem

+0

sí, no tuve tiempo ni siquiera para pensar en la eficiencia, aparte de darme cuenta de que DOM tiene algunas ventajas reales aquí. _pero_ las tareas para las que es útil tal vez no puedan ser implementadas eficientemente de otra manera ... aunque eso sería un argumento para rediseñar datos ... bueno, creo que esto será útil – jlarson

+0

repositorio vacío y sin cambios desde el principio etapa de prototipo? – Qrilka

6

Echa un vistazo a JSON Select - selectores CSS para JSON.

+0

el enlace apunta a un sitio web equivocado. ¿Debería ser jsonselect.com? – user152468

+0

@ user152468 ya no está disponible en jsonselect.org. Actualicé el enlace para ir a su repositorio de GitHub. – orad

3

Intente utilizar JSPath - https://github.com/dfilatov/jspath.

JSPath es un lenguaje específico de dominio (DSL) que le permite navegar y buscar datos dentro de sus documentos JSON. Con JSPath, puede seleccionar elementos de JSON para recuperar los datos que contienen.

JSPath para JSON como un XPath para XML.

1

Acabo de escribir una JS-lib del lado del cliente que hace justamente esto - hace posible consultar una estructura JSON con XPath.

@jlarson - con "defiant.js", se puede consultar su estructura JSON como esto (este lib extiende el objeto JSON global):

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



Esta llamada devolverá un matriz con nodos coincidentes Y esas coincidencias no se separarán de su objeto JSON original (el mismo comportamiento que cuando se trabaja con XML + XPath). Para ilustrar lo que quiero decir, aquí hay una (ish) código de seudo poco:

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 

Este lib es hasta el momento para el navegador y clientside pero he planes para volver a escribir para NodeJS finalmente. Vea el evaluador de Xpath aquí; eso demuestra la funcionalidad. También hay expresiones XPath pre-escrito así:

http://defiantjs.com/#xpath_evaluator

se puede encontrar el lib en Github:
https://github.com/hbi99/defiant.js

Por último, hay un poco más de funcionalidad en "" y defiant.js si está interesado, con suerte lo leerá allí (http://defiant.com)

Espero que lo encuentre útil.

Cuestiones relacionadas