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
答案 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精神的过滤器表达式。