通过keypath从嵌套的JSON字典中获取值,而不使用eval

时间:2013-04-28 08:11:40

标签: javascript json eval

我想通过动态构造的keypath访问嵌套的JSON字典 keypath使用标准的JSON点和下标运算符。 (.[x]
E.g:

var data = 
{"title": "a_title",
 "testList": [
   {
     "testListItemKey": "listitem1"
   },
   {
     "testListItemKey": "listitem2",
          "deepTestList": [
            {
              "testListItemKey": "listitem1",
                      "testListItemDict":{
                         "subTitle": "sub_title",
                      }
            }]
   }]
}

示例密钥路径字符串将是:

data.feedEntries[0].testList[2].deepTestList[1].testListItemDict.subTitle  

我到目前为止找到的最简单的工作解决方案是使用eval或函数构造函数:

function valueForKeypPath(data, keyPath) {
    "use strict";
    var evaluateKeypath = new Function('data', 'return data.' + keyPath);
    return evaluateKeypath(data);
}

由于我无法完全信任从远程端点收到的JSON数据,因此我想避免使用eval et.al。

2 个答案:

答案 0 :(得分:4)

将所有"["替换为".",将"]"替换为"",以便

feedEntries.0.testList.2.deepTestList.1.testListItemDict.subTitle

将其拆分为路径数组,例如使用路径。split('.')

var paths =  ['feedEntries','0','testList','2']

然后只是

var root = data;
paths.forEach(function(path) {
   root = root[path];
});
末尾的

包含所需的数据片段。

答案 1 :(得分:0)

如果您使用“下划线”,我推荐underscore-keypath