我有一个相当大的JSON响应,我对单个字段感兴趣 - status
:
{
"title": "Some title",
"status": "pending",
"data": {
...
},
"meta": {
...
}
}
我需要做的就是将JSON响应的status
值读为字符串。我宁愿不必构建POJO来对其进行建模,因为在我的应用程序中,我只需要将JSON存储在特定状态的数据库中或丢弃它。
该应用程序已经将Jackson用于其他更复杂的案例,所以我更愿意坚持使用该库。到目前为止,我发现的所有示例都尝试将JSON映射到对象。
答案 0 :(得分:8)
如果json响应不是很大,您可以使用ObjectMapper.readTree
将完整的json反序列化为JsonNode
并获取其中的特定属性。
例如:
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(json);
JsonNode statusNode = jsonNode.get("status");
String statusValue = statusNode.textValue();
您还可以按other answer中建议的ObjectNode
将完整的json反序列化为ObjectMapper.readValue
。
如果json响应很大并且反序列化完整的json是一个问题,你可以考虑使用Jackson Streaming API JsonParser
来解析json。
以下是一个例子:
String statusValue = null;
JsonFactory jsonFactory = new JsonFactory();
try (JsonParser parser = jsonFactory.createParser(json)) {
JsonToken startToken = parser.nextToken();
while (parser.nextToken() != JsonToken.END_OBJECT) {
String fieldName = parser.getCurrentName();
if ("status".equals(fieldName)) {
if (parser.nextToken() == JsonToken.VALUE_STRING) {
statusValue = parser.getValueAsString();
break;
}
} else {
parser.skipChildren();
}
}
}
JsonParser
将json分解为一系列令牌,您可以逐个迭代。在该示例中,JsonParser.skipChildren
用于跳过整个对象或数组,以便仅检查第一级json层次结构。
答案 1 :(得分:4)
如果所需字段是非空文本字段,则在JSON
对象的层次结构的“第一级”(即,不是任何嵌套对象)小到足以容纳主存储器,检索其值的方法是使用类似
public static String readField(String json, String name) throws IOException {
if (field != null) {
ObjectNode object = new ObjectMapper().readValue(json, ObjectNode.class);
JsonNode node = object.get(name);
return (node == null ? null : node.textValue());
}
return null;
}
ObjectNode
是一个通用的Jackson类,而不是POJO。如果要使用多个值,则应缓存ObjectMapper
(它甚至是线程安全的)。
运行
System.out.println(readField(response, "status"));
使用上面的JSON响应字符串,返回
pending
正如所料。可以在StackOverflow
中找到类似的解决方案elsewhere。
对于非常大的JSON对象(例如,存储在文件中),应使用Jackson
的流式处理方法,如其他答案所示。