Come accedere ai dati JSON nidificati

Diciamo che ho dati json come

data = {"id":1, "name":"abc", "address": {"streetName":"cde", "streetId":2 } } 

Ora sto ottenendo campi a cui accedere da questi dati JSON come: fields = ["id", "name", "address.streetName"]

Come posso accedere al terzo campo ( address.streetName ) dai dati json dati nel modo più efficiente? data.fields[2] non funziona

Una possibilità è che io costruisca data[address][streetName] stringa data[address][streetName] usando un ciclo for ed data[address][streetName] eval di ciò, ma esiste un modo efficace per farlo?

Ad essere onesti, non riesco a capire il tuo problema. JSON è già strutturato, perché è necessario modificare la struttura?

Nel tuo caso, vorrei accedervi come segue:

 data.address.streetName; 

Se, per caso, quello che vuoi è attraversare i dati, è necessario:

 function traverse_it(obj){ for(var prop in obj){ if(typeof obj[prop]=='object'){ // object traverse_it(obj[prop[i]]); }else{ // something else alert('The value of '+prop+' is '+obj[prop]+'.'); } } } traverse_it(data); 

Aggiornare

Dopo aver letto qui sotto, ciò di cui l’utente ha bisogno sembra più ovvio. Dato i nomi di proprietà come una stringa, lui / lei vuole accedere all’object.

 function findProp(obj, prop, defval){ if (typeof defval == 'undefined') defval = null; prop = prop.split('.'); for (var i = 0; i < prop.length; i++) { if(typeof obj[prop[i]] == 'undefined') return defval; obj = obj[prop[i]]; } return obj; } var data = {"id":1,"name":"abc","address":{"streetName":"cde","streetId":2}}; var props = 'address.streetName'; alert('The value of ' + props + ' is ' + findProp(data, props)); 

Se usi lodash (una libreria di utility molto popolare), puoi usare _.get() .

per esempio

 var data = { "id":1, "name": "abc", "address": { "streetName": "cde", "streetId":2 } } _.get(data, 'address.streetName'); // 'cde' _.get(data, ['address', 'streetName']); // 'cde' 

Se coinvolge un array, puoi utilizzare anche il percorso delle stringhe come 'address[0].streetName' .

per esempio

 var data = { "id":1, "name": "abc", "addresses": [ { "streetName": "cde", "streetId": 2 }, { "streetName": "xyz", "streetId": 102 }, ] } _.get(data, 'addresses[0].streetName'); // cde _.get(data, [address, 1, streetName]); // xyz 

Internamente, usa la funzione toPath() per convertire il percorso delle stringhe (ad es address.streetName ) in un array (es. ['address', 'streetName'] ), e quindi usa una funzione per accedere ai dati nel percorso specificato all’interno dell’object .

Altre funzioni di utilità simili includono _.set() e _.has() . Dategli un’occhiata

Per object.property breve, puoi usare l’ object[property] notazione dell’array object[property] invece di object.property ; questo è particolarmente utile quando i tasti contengono caratteri speciali:

 var data = { "id": 1, "name": "abc", "address": { "streetName": "cde", "streetId": 2 } } data.address.streetName; // (1) dot notation data["address"]["streetName"]; // (2) array notation var field = "streetName"; data["address"][field]; // (3) variable inside array notation var fields = "address.streetName".split("."); data[fields[0]][fields[1]]; // (4) specific to your question 

È ansible utilizzare l’operatore typeof per verificare se una proprietà esiste o meno prima di utilizzarla:

 typeof data["address"]["streetName"]; // returns "string" typeof data["address"]["foobarblah"]; // returns "undefined" 

La tua variabile di data non ha una proprietà fields , ed è per questo che data.fields[2] non funziona. Penso che quello che stai cercando di fare sia data[fields[2]] , che funzionerebbe per un object semplice, ma non puoi indicizzare in un object complesso come quello.

puoi accedervi in ​​questo modo data.address.streetName

JavaScript:

 function getProperty(json, path) { var tokens = path.split("."); var obj = json; for (var i = 0; i < tokens.length; i++) { obj = obj[tokens[i]]; } return obj; } var data = { id: 1, name: "abc", address: { streetName: "cde", streetId: 2 } }; var fields = ["id", "name", "address.streetName"]; for (var i = 0; i < fields.length; i++) { var value = getProperty(data, fields[i]); console.log(fields[i] + "=" + value); } 

Produzione:

 id=1 name=abc address.streetName=cde