2012-03-12 14 views
5

Básicamente quiero poder, en Javascript (JQuery opcionalmente), buscar en un JSON con elementos anidados para un elemento en particular y editarlo.Búsqueda y edición de elementos JSON anidados

Ej. busque "componentes" con id 110 y cambie el nombre a "tarjeta de video".

Observe que el siguiente JSON es solo un ejemplo. Me pregunto si existen javascript libraries o buenos trucos para hacer tal cosa, no creo que atravesar todo el json o escribir mis propios métodos sea la mejor solución.

{ 
    "computers": [ 
    { 
    "id": 10, 
    "components": [ 
     { 
      "id": 56, 
      "name": "processor" 
     }, 
     { 
      "id": 24, 
      "name": "ram" 
     } 
     ] 
    }, 
    { 
     "id": 11, 
     "components": [ 
     { 
      "id": 110, 
      "name": "graphic card" 
     }, 
     { 
      "id": 322, 
      "name": "motherboard" 
     } 
     ] 
    } 
    ] 
} 
+2

Atravesando el objeto es la única *** *** opción. Todas las respuestas que obtenga aquí lo harán de una manera u otra. – Matt

+0

Ok, pero creo que las bibliotecas ya existen para hacer algo así, en particular no solo buscando dentro de JSON, sino que también me permiten editarlo. – Fr4ncis

+2

Solo para quitárselo del camino: en el momento en que lo está buscando, ya no es JSON; es solo un gráfico de objetos. –

Respuesta

2

Puede probar linq.js.

+0

He usado linq.js en gran medida, y aunque es un poco prolijo, ¡funciona genial! –

1

Puede usar este javascript lib, DefiantJS (http://defiantjs.com), con el que puede filtrar coincidencias utilizando XPath en estructuras JSON. Para ponerlo en código JS:

var data = { 
     "computers": [ 
      { 
      "id": 10, 
      "components": [ 
       { "id": 56, "name": "processor" }, 
       { "id": 24, "name": "ram" } 
      ] 
      }, 
      { 
      "id": 11, 
      "components": [ 
       { "id": 110, "name": "graphic card" }, 
       { "id": 322, "name": "motherboard" } 
      ] 
      } 
     ] 
    }, 
    res = JSON.search(data, '//components[id=110]'); 

res[0].name = 'video card'; 

Aquí hay un violín que funciona;
http://jsfiddle.net/g8fZw/

DefiantJS extiende el JSON objeto global con el método de "búsqueda" y devuelve una matriz con los partidos (matriz vacía si no se encontraron coincidencias). Puede probar las consultas lib y XPath XPath utilizando el evaluador aquí:

http://www.defiantjs.com/#xpath_evaluator

Cuestiones relacionadas