2014-03-13 189 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精神的過濾器表達式。