【问题标题】:JSON path parsing - object vs arrayJSON 路径解析 - 对象 vs 数组
【发布时间】:2014-04-18 13:10:28
【问题描述】:
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

【问题讨论】:

    标签: json node.js parsing


    【解决方案1】:

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

    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 或其他名称!

    【讨论】:

      【解决方案2】:

      我已经修改了 s3u/JSONPath 模块,以便能够将约束应用于单个对象,而不仅仅是数组元素。通过该修改,您可以通过这条单一路径获得所需的内容: "$.book[?(@.type=='type 1')]"

      这里是对 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 精神的过滤器表达式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        • 2015-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        相关资源
        最近更新 更多