在java中查询JSONObject

Pam*_*put 39 java json jackson gson

我想知道是否存在能够查询JSONObject的java librery.更深入地,我正在寻找类似的东西:

String json = "{ data: { data2 : { value : 'hello'}}}";

...
// Somehow we managed to convert json to jsonObject
...

String result = jsonObject.getAsString("data.data2.value");

System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

我希望得到"你好"作为输出.

到目前为止,我发现最快的方法是使用Gson:

jsonObject.getAsJsonObject("data").getAsJsonObject().get("data2").getAsJsonObject("value").getAsString();
Run Code Online (Sandbox Code Playgroud)

写入和阅读实际上并不容易.有更快的东西吗?

n1c*_*las 41

我刚刚意外地发现了一个非常有趣的项目:JSON Path

JSONPath是JSON XPATH对XML的一种提取,是一种提取给定文档部分的简单方法.

使用此库,您可以更轻松地完成您要求的操作,然后是我之前的建议:

String hello = JsonPath.read(json, "$.data.data2.value");

System.out.println(hello); //prints hello
Run Code Online (Sandbox Code Playgroud)

希望这可能也有帮助.


Sta*_*Man 22

虽然不完全相同,杰克逊的树模型表示类似于Gson:

JsonNode root = objectMapper.readTree(jsonInput);
return root.get("data").get("data2").get("value").asText();
Run Code Online (Sandbox Code Playgroud)

所以你需要一步一步地遍历它.

编辑(2015年8月)

实际上现在(自Jackson 2.3以来)支持与杰克逊的JSON指针表达式.所以你可以选择使用:

return root.at("/data/data2/value").asText();
Run Code Online (Sandbox Code Playgroud)

  • 您可以将`get`更改为`path`以避免空值. (3认同)
  • Gson有类似的东西吗? (2认同)

n1c*_*las 16

首先,我建议考虑JSON对象绑定.

但是如果您获得任意JSON对象并且您希望以您描述的方式处理它们,我建议将Jackson JSON处理器与Apache的Commons Beanutils结合使用.

这个想法如下:Jackson默认将所有JSON作为java.util.Map实例处理,同时Commons Beanutils简化了对象的属性访问,包括数组和Map支持.

所以你可以使用这样的东西:

//actually it is a Map instance with maps-fields within
Object jsonObj = objectMapper.readValue(json, Object.class);

Object hello = PropertyUtils.getProperty(jsonObj, "data.data2.value")

System.out.println(hello); //prints hello
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用 org.json

    String json = "{ data: { data2 : { value : 'hello'}}}";
    org.json.JSONObject obj = new org.json.JSONObject(json);
    System.out.println(obj.query("/data/data2/value"));
Run Code Online (Sandbox Code Playgroud)