如何访问嵌套的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"
你的data
variables没有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