2013-03-13 91 views
0

我要尋找一個JSONPath表達式返回與zoneType「大」的所有區域內的對象的對象。JSONPath表達式搜索在不同的樹枝某些屬性

輸入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 = '大')。?。 ')]

和其他許多人,但沒有運氣。

回答

0

我也是最初使用jsonpath後來遇到了一些問題,所以決定使用 循環遍歷data.so你可以嘗試使用下面的一段代碼。

變種JSON =烏爾JSON數據;

VAR輸出=(功能(數據){

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);

0

的答案應該是:$ ..區[(@ zoneType == 「大」。)?]

以下工作: -

JsonPath.on(json_hash,「$ ..區[? (@ .zoneType == 「大」)]')

回報: -

[{ 「了zoneid」=> 1 「zoneType」=> 「大」},{ 「了zoneid」=> 4 「zoneType」=> 「大」}]

0

JSONPath是不標準 「查詢語言」,但XPath是。使用DefiantJS,您可以使用XPath表達式查詢JSON結構。該庫與延伸「搜索」的方法中的全局對象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;