如何在JSON对象数组中获取所有子节点的JSONPath?

4
您如何获取一个对象的所有子节点的JSONPath呢?
例如:
var data = [{
    "key1": {
        "children": [{
            "key2": "value",
            "key3": "value",
            "key4": {}
        }, {
            "key2": "value",
            "key3": "value",
            "key4": {}
        }],
        "key5": "value"
    }
}, {
    "key1": {
        "children": {
            "key2": "value",
            "key3": "value",
            "key4": {}
        },
        "key5": "value"
    }
}]

我希望能够得到一个数据结构中所有节点的绝对路径数组:
[
    "data[0]['key1']['children'][0]['key2']", 
    "data[0]['key1']['children'][0]['key3']", 
    "data[0]['key1']['children'][0]['key4']", 
    ......, 
    "data[0]['key1']['children'][1]['key2']",
    ......., 
    "data[1]['key1']['children']['key2']",
    ..........
]

有没有办法使用JS来完成这个任务?

是的,我想有很多方法可以做到这一点...你卡在哪里了? - elclanrs
好的,我理解“JSONPath”这个术语(根据标签描述,它很有意义(与XPath和XML之间的比较似乎很合适))。但是你的示例中并没有使用JSON,因此我会相应地编辑你的问题。 - Felix Kling
你可能想看一下https://dev59.com/X2ct5IYBdhLWcg3wpfFc。 - Felix Kling
@elclanrs,我正在寻找一些简单的自定义代码。我也会尝试这个。 - Okky
@FelixKling:我可以手动编写它,但我正在寻找一段代码,当输入JSON数组时生成JSON路径数组。 - Okky
显示剩余5条评论
2个回答

5
我编写了一段自定义代码,以数组形式提供所有节点的JSON路径。
function toArray(obj, name) {
    var result = [];
    var passName;
    var tempArray = [];
    for (var prop in obj) {
        var value = obj[prop];
        if (typeof value === 'object') {
            if ($.isNumeric(prop)) {
                passName = name + "[" + prop + "]";
            } else {
                passName = name + "['" + prop + "']";
            }
            tempArray = toArray(value, passName);
            $.each(tempArray, function (key, value) {
                result.push(value);
            });

        } else {
            result.push(name + "['" + prop + "']");
        }
    }
    return result;
}

JS Fiddle


3

好的,我认为你需要遍历整个JSON结构。

  for(var i=0; i<data.length; i++) {
     for(var j in data[i]){
       //and so on
      }
   }

或者,您可以为每个键创建别名数组,其中键将是该值的路径,使用“_”作为分隔符,例如..
 var aleasArray = []; 
 for(var i=0; i<data.length; i++) {
     for(var j in data[i]){
      aleasArray[i + '_' + j] = data[i][j];  // if you want make it more generalize aleas array..
      }
   }

希望这能对您有所帮助。


嵌套数组的路径怎么样? - Okky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接