如何访问嵌套的 JSON 数据

IT技术 javascript json object
2021-01-18 16:12:57

假设我有 json 数据,例如

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

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

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

一种可能性是我data[address][streetName]使用 for 循环构造字符串并对其进行评估,但有没有有效的方法来做到这一点?

6个回答

老实说,我无法理解你的问题。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);

更新

阅读下文后,该用户的需求似乎更加明显。给定属性名称作为字符串,他/她想要访问该对象。

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));
是的,我认为它是解决这个问题最有效的方法。谢谢。
2021-03-18 16:12:57
+1 我认为你data.address.streetName说得对,这可能是他正在寻找的,尽管他的问题不清楚。
2021-03-27 16:12:57
嗯,我再解释一遍:address.streetName 是一个变量来找我。我有 json 格式的数据。情况就像我有 JSON 格式的数据,有人将“address.streetName”传递给我,问题是我应该如何从数据中访问此键的值
2021-04-01 16:12:57
第 5 行应该是obj = obj[prop[i]]如果在对象中找不到属性字符串,请记住尝试捕获错误。否则是一个很好的答案。+1
2021-04-06 16:12:57
请务必将帮助您的答案标记为“正确答案”。
2021-04-08 16:12:57

如果您使用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'

例如

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()去看一下。

lodash 它非常直接地做到这一点。
2021-03-30 16:12:57
@Brian Park 你的回答让我大吃一惊!好东西。谢谢。
2021-04-01 16:12:57

长话短说,您可以使用数组表示法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变量没有fields属性,这就是为什么data.fields[2]不起作用。我认为你在那里尝试做的是data[fields[2]],它适用于一个简单的对象,但你不能像那样索引到一个复杂的对象。

是的,是否有任何访问嵌套数据的有效方法与以下比较: col = "address.streetName" //key exp = "x" // data; col = col.split(".") for(var i=0; i<col.length; i++) exp+='["' + col[i] + '"]'; 评估(exp)
2021-03-14 16:12:57

你可以通过这种方式访问​​它 data.address.streetName

你不能只是遍历你的记录并做一个 if address.streetname == x
2021-03-24 16:12:57
是的,但我得到了字符串格式的密钥......我的意思是有人给我传递了“address.streetName”
2021-04-08 16:12:57