【问题标题】:How would you get a JSONPath to all child nodes in an array of JSON object?您如何获得 JSON 对象数组中所有子节点的 JSONPath?
【发布时间】:2013-09-05 06:37:33
【问题描述】:

如何获得对象所有子节点的 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 中完成这项工作?

【问题讨论】:

  • 是的,我想有很多方法可以做到这一点......你在哪里卡住了?
  • 好的,我理解“JSONPath”一词(根据标签描述,它是有道理的(与 XPath 和 XML 的比较似乎很合适))。但是您的示例中没有使用 JSON,因此我将相应地编辑您的问题。
  • 我对如何纠正递归函数感到困惑。
  • 这有帮助吗? code.google.com/p/jsonpath

标签: javascript jquery jsonpath


【解决方案1】:

我编写了一个自定义代码,它将所有节点的 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

【讨论】:

    【解决方案2】:

    好吧,我认为你必须遍历整个 json 结构..

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

    或者简单地说,您可以为每个键创建 aleas 数组,其中键将是该值的路径,以“_”作为分隔符,例如..

     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..
          }
       }
    

    希望这会对你有所帮助..

    【讨论】:

    • 嵌套数组的路径呢
    猜你喜欢
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多