如何使用jackson JsonNode浏览未知的密钥名称?

时间:2016-03-20 03:28:10

标签: java json jackson

我正在解析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并抓住第一个,但有更简单的方法吗?

1 个答案:

答案 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()两次来牺牲性能以简洁起见。您当然可以修改它以将迭代器首先保存到变量中。

相关问题