JSON路径解析 - 对象与数组

时间:2014-03-13 16:20:43

标签: json node.js parsing

var sample1 = {
  "book" : {
    "name" : "book 1",
    "type" : "type 1"
  }
}

var sample2 = {
  "book" : [{
      "name" : "book 1",
      "type" : "type 1"
    }, {
      "name" : "book 2",
      "type" : "type 2"
    }, {
      "name" : "book 1",
      "type" : "type 3"
    }
  ]
}

任何人都可以帮我构建一个JSON路径来从两个样本中提取type =“type 1”的书名吗?问题是本书可以是一个数组或一个对象,但我只能有一个json路径来提取值。任何帮助将不胜感激。

我正在使用此节点模块进行解析 - https://github.com/s3u/JSONPath

2 个答案:

答案 0 :(得分:0)

具有逻辑循环的函数可能会起作用:

function getBooks(type, object) {
    var response = [];

    for (var key in object) {
        if (object.hasOwnProperty(key)) {
            //If its an object, another for-in loop
            if (typeof object[key] == object) {
                for (var k in object[key]) {
                    if (object[key].hasOwnProperty(k)) {
                        if (object[key][k].type == type) {
                            response.push(object[key][k]);
                        }
                    }
                }
            //If array, a normal for loop will do
            } else if (typeof object[key] == array) {
                for (var i = 0; i < object[key].length; i++) {
                    if (object[key][i].type == type) {
                        responses.push(object[key][i]);
                    }
                }
            }
        }
    }
    return response;
}

您现在应该可以传入任一个对象(包含书籍或书籍对象)和type以匹配并获取一系列匹配对象。这是未经测试的,所以请耐心等待。

编辑:object也是该参数的可怕命名选择,将其更改为bookObject或其他内容!

答案 1 :(得分:0)

我修改了s3u / JSONPath模块,以便能够将约束应用于单个对象,而不仅仅是数组元素。通过这种修改,您可以通过以下单一途径获得您所要求的内容: &#34; $。book [?(@。type ==&#39; type 1&#39;)]&#34;

以下是jsonpath.js的修改:

JSONPath.prototype._walk = function (loc, expr, val, path, f) {
    var i, n, m;

    if (!Array.isArray(val)) {
        //make it array of one element, so that @ filters can be applied to non-arrays
        val = [val];
    }

    for (i = 0, n = val.length; i < n; i++) {
          f(i, loc, expr, val, path);
    }

};

我还没有承诺,它可能应该由该项目的贡献者投票,但随意做到这一点。

我在我的项目中使用了这个修改过的模块,它允许我编写更符合JSONPath精神的过滤器表达式。