2014-04-17 184 views
3

我有誰具有完全相同的架構多JSON文件JSON元素:選擇不具有節點名稱

{"q0":{"query":"William","limit":3}} 
{"q1":{"query":"Joe","limit":3}} 

使用XPath或JSONPath我想每個元素提取到表格:

|id | query |limit | 
|q0 | William | 3 | 
|q1 | Joe  | 3 | 

我沒有問題得到查詢和限制字段使用..query..limit,但我can'a找到語法來提取id字段(即q0q1)。

我一直在嘗試@*$*沒有成功。 那麼有沒有辦法選擇一個沒有節點名稱的JSON元素?

正如在評論中所說,我使用talend tExtractJSONField組件,它使用XPath來解析JSON。

+0

XPath用於XML元素,不適用於JSON。有JSONiq(基本上JQuery的XQuery)和許多XQuery處理器有某種JS​​ON解析,但XPath不會工作 – dirkk

+0

感謝@dirkk我正在使用talend tExtractJSONField組件使用XPath來解析JSON。使用http://goessner.net/articles/JsonPath/然後,我可以輕鬆地將XPath轉換爲JSONPath。 – magdmartin

+2

你到底想要得到什麼結果?我的意思是,如果你想要根元素,爲什麼不簡單地拿JSON就這樣。 – dirkk

回答

2

使用.您可以獲取當前元素。使用JsonPath提取密鑰名稱是不可能的。因此,您可以使用for並通過抓取密鑰名稱在JavaScript中執行此操作。

以下HTML顯示一個完整的例子:

<html> 

    <head> 
    <link rel="stylesheet" href="style.css"> 
    <script src="jsonpath.js"></script>  
    </head> 

    <body> 
    <h1 id="h1"></h1> 
    <script type="text/javascript"> 
     var o = {"q0":{"query":"WilLIAM","limit":3}}; 
     var key; 
     for(var i in jsonPath(o, ".")[0]) key = i; 
     document.getElementById("h1").appendChild(document.createTextNode(
     key 
     )); 
    </script> 
    </body> 

</html> 

這裏是一個Plunkr:http://plnkr.co/edit/CaZD1lVhr1E2S8VN5vnP

0

http://goessner.net/articles/JsonPath/的文檔將指向$.q0

+0

謝謝@Francois,在SO上發佈之前,我在這個頁面上花了幾個小時。其實我的問題並沒有很好的框架,因爲我試圖提取第一個元素,而不管它的內容。 $ .q0。在這種情況下太窄了。 – magdmartin

0

通過使用谷歌的GSON庫中,可以作爲閱讀以下內容。

HashMap<String, JsonElement> myMap = new Gson().fromJson(jsonString, new TypeToken<HashMap<String, JsonElement>>(){}.getType()); 

String id = null, query = null; 
int limit = 0; 

for (Entry<String, JsonElement> entry : myMap.entrySet()) { 
    id = entry.getKey(); 
    if(entry.getValue() != null) { 
    JsonElement je = entry.getValue(); 
    if(je.isJsonObject()) { 
     JsonObject jo = je.getAsJsonObject(); 
     query = jo.get("query").getAsString(); 
     limit = jo.get("limit").getAsInt(); 
    } 
    } 
} 
print("id : " + id + " query : " + query + " limit : " + limit); 
0

實際上,您可以使用DefiantJS在您的JSON結構上使用XPath。該庫使用「搜索」方法擴展全局對象JSON,您可以使用它查詢XPath的JSON結構。該方法以數組形式返回匹配項。

var data = [ 
     { 
      "q0": { 
      "query": "William", 
      "limit": 3 
      } 
     }, 
     { 
      "q1": { 
      "query": "Joe", 
      "limit": 1 
      } 
     }, 
     { 
      "q1": { 
      "query": "Bill", 
      "limit": 2 
      } 
     } 
    ], 
    found_1 = JSON.search(data, "//*[limit=3]"), 
    found_2 = JSON.search(data, "//*[limit>1]"); 

document.getElementById('output_1').innerHTML = found_1[0].query; 
document.getElementById('output_2').innerHTML = found_2[0].length; 

要看到這在行動,請看看這個小提琴; http://jsfiddle.net/hbi99/zWU6x/

此外,請查看此處的XPath評估程序以查看和測試XPath查詢; http://defiantjs.com/#xpath_evaluator

相關問題