JSONPath表达式,用于搜索具有不同树分支中某些属性的对象

时间:2013-03-13 22:59:54

标签: json jsonpath

我正在寻找一个JSONPath表达式,它返回zoneType为“big”的所有区域对象。

输入JSON:

{
  "board" : {
     "zones" : {
          "1": {
              "zoneID": 1, 
              "zoneType":"big" 
           },
           "2": {
              "zoneID": 2, 
              "zoneType":"small"
           },
           "3": { 
             "zoneID": 3,
             "zoneType":"small" 
           },
          "4": {
              "zoneID": 4, 
              "zoneType":"big" 
           },
       }
   }
}

预期产出:               [{                   “zoneID”:1,                   “zoneType”: “大”                },                {                   “zoneID”:4,                   “zoneType”: “大”                }]

我试过了: $ ..区域。[?(@。zoneType = '大')] $ ..区域。* [?(@。zoneType = '大')]

和其他许多人但没有运气。

3 个答案:

答案 0 :(得分:0)

我最初也使用了jsonpath然后后来遇到了一些问题因此决定使用 循环遍历数据。你可以试试下面的代码。

var json = ur json data;

var output =(function(data){

var keys = (function (obj) {
    var keys = [];
    for (var key in obj) {
        keys.push(key);
    }
    return keys;
})(data["board"]["zones"]);
var categoryFilter = new Function('data,keys',
        "obj=[];" +
        "for(var i=0;i<keys.length;i++){" +
            "if (data[keys[i]].zoneType == 'big') {" +
               "obj.push(data[keys[i]]);" +

            "}" +
        "}" +
        "return obj;"
        );
return JSON.stringify(categoryFilter(data["board"]["zones"], keys));

})(JSON);

答案 1 :(得分:0)

答案应该是:$ ..区域[?(@。zoneType ==“big”)]

以下作品: -

JsonPath.on(json_hash,'$ .. zones [?(@。zoneType ==“big”)]')

返回: -

[{“zoneID”=&gt; 1,“zoneType”=&gt;“big”},{“zoneID”=&gt; 4,“zoneType”=&gt;“big”}]

答案 2 :(得分:0)

JSONPath是非标准化的“查询语言”,但XPath是。使用DefiantJS,您可以使用XPath表达式查询JSON结构。该库使用方法“search”扩展全局对象JSON,并将匹配作为对象返回数组。

下面是示例代码(这里是小提琴http://jsfiddle.net/hbi99/DQ9CJ/):

var data = {
       "board": {
          "zones": {
             "1": {
                "zoneID": 1,
                "zoneType": "big"
             },
             "2": {
                "zoneID": 2,
                "zoneType": "small"
             },
             "3": {
                "zoneID": 3,
                "zoneType": "small"
             },
             "4": {
                "zoneID": 4,
                "zoneType": "big"
             }
          }
       }
    },
    found = JSON.search(data, '//*[zoneType="big"]'),
    str = '';

for (var i=0; i<found.length; i++) {
    str += found[i].zoneID +'<br/>';
}

document.getElementById('output').innerHTML = str;