我正在解析api的一些输出,我想让解析逻辑尽可能通用。许多api调用在公共包装器中返回一个对象。回答看起来像这样:
{
"success": true,
"data": {
"object_type": {
"object_id": { /* actual object data */ }
}
}
}
在此回复中,object_type
可以是几个不同字符串中的一个。我正在编写一个函数来处理这些响应,它接受内部对象的类引用:
private static ObjectMapper MAPPER = new ObjectMapper();
<T> APIResponse<T> parseResponse(String input, Class<T> clazz) {
JsonNode node = MAPPER.readTree(input);
boolean success = node.path("success").asBoolean(true);
// This is what I'd like to be able to do but I can't seem to
// find anything like it
JsonNode objectNode = node.path("data").unwrap().firstValue();
T object = MAPPER.treeToValue(objectNode, clazz);
return APIResponse.of(success, object);
}
有没有办法跳过这个字符串和id字段来获取对象?我知道我可以在JsonNode上调用.elements并抓住第一个,但有更简单的方法吗?
答案 0 :(得分:1)
检查JsonNode
javdoc,我带了以下snipet:
JsonNode data = node.path("data");
if (!data.isMissingNode()) { // checks if data exists
if (data.iterator().hasNext()) { // checks if data is not empty
// get first child ("unwrap")
JsonNode firstNodeInsideData = data.iterator().next();
}
}
你可以使用相同的技巧深入树内 注意:此代码通过调用iterator()两次来牺牲性能以简洁起见。您当然可以修改它以将迭代器首先保存到变量中。