2014-03-13 159 views
0
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路径来提取值。任何帮助,将不胜感激。JSON路径解析 - 对象与数组

我使用这个节点模块解析 - https://github.com/s3u/JSONPath

回答

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什么的!

0

我修改了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精神的过滤器表达式。