如何用Jackson读取单个JSON字段

ddi*_*hev 5 java json jackson

我有一个相当大的JSON响应,我对单个字段感兴趣 - status:

{
  "title": "Some title",
  "status": "pending",
  "data": {
    ...
  },
  "meta": {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我需要做的就是status将JSON响应的值读为字符串.我宁愿不必构建POJO来对其进行建模,因为在我的应用程序中,我只需要将JSON存储在特定状态的数据库中或丢弃它.

该应用程序已经将Jackson用于其他更复杂的案例,因此我更愿意坚持使用该库.到目前为止,我发现的所有示例都尝试将JSON映射到对象.

Wil*_*son 9

如果json响应不是很大,您可以使用ObjectMapper.readTree反序列化完整的json JsonNode并获取其中的特定属性.

例如:

ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(json);
JsonNode statusNode = jsonNode.get("status");
String statusValue = statusNode.textValue();
Run Code Online (Sandbox Code Playgroud)

您还可以ObjectNode通过其他答案中ObjectMapper.readValue建议将完整的json反序列化.

如果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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

JsonParser将json分解为一系列令牌,您可以逐个迭代.在该示例中,JsonParser.skipChildren用于跳过整个对象或数组,以便仅检查第一级json层次结构.


PNS*_*PNS 7

如果所需字段是非空文本字段,则在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;
  }
Run Code Online (Sandbox Code Playgroud)

ObjectNode是通用的Jackson类,而不是 POJO。如果要使用多个值,则ObjectMapper应该缓存(它甚至是线程安全的)。

跑步

System.out.println(readField(response, "status"));
Run Code Online (Sandbox Code Playgroud)

使用上面的 JSON 响应字符串,返回

pending
Run Code Online (Sandbox Code Playgroud)

正如预期的那样。类似的解决方案可以发现别处StackOverflow

对于非常大的 JSON 对象(例如,存储在文件中),Jackson应使用的流方法,如其他答案中所建议。