选择没有节点名称的JSON元素

时间:2014-04-17 06:41:03

标签: json xpath jsonpath

我有多个具有相同架构的JSON文件:

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

使用xpath或JSONPath我想将每个元素提取到表中:

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

使用..query..limit获取查询和限制字段没有问题,但我可以找到提取id字段的语法(即q0q1)。

我一直在尝试@*$*但没有成功。 那么有没有办法选择一个没有节点名的JSON元素?

如评论中所述,我使用talend tExtractJSONField组件,该组件使用XPath来解析JSON。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

http://goessner.net/articles/JsonPath/处的文档会指向$.q0

答案 2 :(得分:0)

使用Google的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);

答案 3 :(得分:0)

实际上,您可以使用DefiantJS在JSON结构上使用XPath。该库使用方法&#34; search&#34;扩展全局对象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