我想知道是否存在一个能够查询JSON对象的java库。更深入地,我正在寻找类似的东西:
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();
写入和阅读实际上并不容易。有更快的东西吗?
我刚刚意外地发现了一个非常有趣的项目:JSON Path
JSONPath是JSON XPATH对XML的一种提取,是一种提取给定文档部分的简单方法。
使用此库,您可以更轻松地完成您要求的操作,然后我之前的建议:
String hello = JsonPath.read(json, "$.data.data2.value");
System.out.println(hello); //prints hello
希望这可能也有帮助。
虽然不完全相同,杰克逊的树模型表示类似于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();
首先,我建议考虑JSON对象绑定。
但是如果您获得任意JSON对象并且您希望以您描述的方式处理它们,我建议将Jackson JSON processor与Apache的Commons Beanutils结合使用。
这个想法如下:杰克逊默认处理所有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
你可以使用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"));
我想没办法。
考虑一个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类中所做的那样。