如何访问嵌套的JSON数据

假设我有像json数据

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

现在我正在从这个JSON数据像fields = ["id", "name", "address.streetName"]

我怎样才能以最有效的方式访问给定json数据的第三个字段( address.streetName )? data.fields[2]不起作用

一种可能性是我使用for循环构造data[address][streetName]string,并对此进行评估,但有没有这样做的有效方法?

说实话,我不明白你的问题。 JSON已经构造出来了,为什么你需要改变结构呢?

在你的情况下,我会访问它如下:

 data.address.streetName; 

如果有的话,你想要的是遍历数据,你需要:

 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); 

更新

阅读下面后,这个用户需要什么似乎更明显。 给定属性名称作为一个string,他/她想访问该对象。

 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)); 

如果使用lodash (一个非常受欢迎的实用程序库),则可以使用_.get()

例如

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

如果涉及数组,则可以使用像'address[0].streetName'这样'address[0].streetName'stringpath。

例如

 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 

在内部,它使用toPath()函数将stringpath(例如address.streetName )转换为数组(例如['address', 'streetName'] ),然后使用函数访问对象内给定path的数据。

其他类似的实用函数包括_.set()_.has() 。 去看一下。

长话短说,可以使用数组表示法object[property]而不是object.property ; 这在键包含特殊字符时特别有用:

 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 

在使用之前,可以使用typeof运算符来检查属性是否存在:

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

你的datavariables没有fields属性,这就是为什么data.fields[2]不起作用。 我认为你在那里试图做的是data[fields[2]] ,这将适用于一个简单的对象,但你不能索引到一个复杂的对象。

你可以通过这种方式访问​​它的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); } 

输出:

 id=1 name=abc address.streetName=cde