在java中查询JSONObject

时间:2013-03-15 10:20:29

标签: 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);

我希望得到“你好”作为输出。

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

jsonObject.getAsJsonObject("data").getAsJsonObject().get("data2").getAsJsonObject("value").getAsString();

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

6 个答案:

答案 0 :(得分:38)

我出乎意料地发现了一个非常有趣的项目:JSON Path

  

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

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

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

System.out.println(hello); //prints hello

希望这可能也有帮助。

答案 1 :(得分:19)

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

JsonNode root = objectMapper.readTree(jsonInput);
return root.get("data").get("data2").get("value").asText();

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

编辑(2015年8月)

现在(自杰克逊2.3以来)支持杰克逊的JSON Pointer表达。所以你也可以使用:

return root.at("/data/data2/value").asText();

答案 2 :(得分:16)

首先,我建议考虑使用JSON对象绑定。

但是如果您获得任意JSON对象并且希望以您描述的方式处理它们,我建议将Jackson JSON processor与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

答案 3 :(得分:3)

您可以使用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"));

答案 4 :(得分:1)

我认为没办法。

考虑一个java类

class Student {
    Subject subject = new Subject();
}

class Subject {
    String name;
}

如果我们想要访问主题名称,那么

Student stud = new Student();
stud.subject.name; 

我们无法直接访问名称,如果是,那么我们将无法获得正确的主题名称。像这里:

jsonObject.getAsJsonObject("data")
          .getAsJsonObject()
          .get("data2")
          .getAsJsonObject("value")
          .getAsString();

如果你想使用像java对象一样的话,那么使用

ClassName classObject = new Gson().fromJson(JsonString, ClassName.class);

ClassName必须包含与jsonstring匹配的所有字段。如果你在jsonobject中有一个jsonobject,那么你必须像在Student和Subject类中那样创建单独的类。

答案 5 :(得分:0)

使用Java JSON API 1.1.x(javax.json)可以利用新的JavaPointer接口。可以将实现此接口的实例作为某种XPath表达式类似物进行扩展(有关详细信息,请参见RFC-6901)。因此,您可以这样编写:

import javax.json.*;
//...
var jp = Json.createPointer("/data/data2/value");
System.out.println(jp.getValue(jsonObject));

在JSON的1.1.4版本中,JsonStructure接口(由JsonObjectJsonArray实现)也有了不错的补充,即getValue(String jsonPointer)。因此,一切都归结为这个简单的一线:

System.out.println(jsonObject.getValue("/data/data2/value"));