首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何访问嵌套的JSON数据

如何访问嵌套的JSON数据
EN

Stack Overflow用户
提问于 2012-02-27 18:11:31
回答 8查看 147.6K关注 0票数 22

假设我有如下的json数据:

代码语言:javascript
运行
复制
data = {"id":1,
        "name":"abc",
        "address": {"streetName":"cde",
                    "streetId":2
                    }
        }

现在,我从这个json数据中获取要访问的字段,比如:fields = ["id", "name", "address.streetName"]

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

一种可能是我使用data[address][streetName]循环构造for字符串并进行求值,但是有没有什么有效的方法呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-02-27 18:16:32

老实说,我不能理解你的问题。JSON已经被结构化了,为什么还需要改变结构呢?

在您的情况下,我将访问它,如下所示:

代码语言:javascript
运行
复制
data.address.streetName;

如果碰巧你想要遍历数据,你需要:

代码语言:javascript
运行
复制
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);

更新

在阅读下面的内容后,这个用户的需求似乎更明显了。给定字符串形式的属性名称,他/她想要访问对象。

代码语言:javascript
运行
复制
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));
票数 42
EN

Stack Overflow用户

发布于 2016-01-16 10:38:52

如果您使用lodash(一个非常流行的实用程序库),则可以使用_.get()

例如:

代码语言:javascript
运行
复制
var data = {
  "id":1,
  "name": "abc",
  "address": {
    "streetName": "cde",
    "streetId":2
  }
}
_.get(data, 'address.streetName');
// 'cde'
_.get(data, ['address', 'streetName']);
// 'cde'

如果它涉及一个数组,你也可以使用像'address[0].streetName'这样的字符串路径。

例如:

代码语言:javascript
运行
复制
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()函数将字符串路径(例如address.streetName)转换为数组(例如['address', 'streetName']),然后使用一个函数访问对象中给定路径的数据。

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

票数 22
EN

Stack Overflow用户

发布于 2012-02-27 18:45:28

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

代码语言:javascript
运行
复制
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运算符检查该属性是否存在:

代码语言:javascript
运行
复制
typeof data["address"]["streetName"]; // returns "string"
typeof data["address"]["foobarblah"]; // returns "undefined"
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9463233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档