2012-03-12 11 views
5

Fondamentalmente voglio essere in grado, in Javascript (JQuery facoltativamente), di cercare in un JSON con elementi nidificati per un particolare elemento e modificarlo.Ricerca e modifica elementi JSON annidati

Es. cercare "componenti" con id 110 e cambiare il nome in "scheda video".

Si noti che il seguente JSON è solo un esempio. Mi chiedo se esistono librerie javascript o trucchi validi per fare una cosa del genere, non penso che attraversare l'intero processo o scrivere i miei metodi sia la soluzione migliore.

{ 
    "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

Attraversando l'oggetto è l'unica opzione *** ***. Tutte le risposte che ottieni qui lo faranno in un modo o nell'altro. – Matt

+0

Ok, ma credo che le librerie esistano già per fare una cosa del genere, in particolare non solo per cercare all'interno del JSON ma anche per consentirmi di modificarlo effettivamente. – Fr4ncis

+2

Solo per toglierlo di mezzo: quando lo stai cercando, non è più JSON; è solo un oggetto grafico. –

risposta

2

Si potrebbe provare linq.js.

+0

Ho usato linq.js in misura significativa, e sebbene sia un po 'prolisso, funziona alla grande! –

1

È possibile utilizzare questo javascript lib, DefiantJS (http://defiantjs.com), con cui è possibile filtrare le corrispondenze utilizzando XPath su strutture JSON. Per inserirlo nel codice 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'; 

Ecco un violino funzionante;
http://jsfiddle.net/g8fZw/

DefiantJS estende la JSON oggetto globale con il metodo di "ricerca" e restituisce un array con le partite (array vuoto se non sono stati trovati partite). È possibile provare le query XPath e lib utilizzando il XPath Evaluator qui:

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