首页 > 解决方案 > 使用 Jackson 解析嵌套 JSON 时,首选方法是 ArrayNode 还是 TypeReference?

问题描述

我必须解析以下 JSON。我有两种解决方案,我正在尝试确定哪种方法是首选方法。

{
    "created": true,
    "entries": [{
        "NewValue": "test1",
        "Operation": "ADD",
        "FieldIdentifier": "name",
        "FieldType": "AN",
        "FieldLength": 35,
        "OriginalValue": ""
    },
    {
        "NewValue": "test2",
        "Operation": "ADD",
        "FieldIdentifier": "age",
        "FieldType": "AN",
        "FieldLength": 35,
        "OriginalValue": "testOrig"
    }]
}

解决方案1:使用readTree将JSON获取为我们可以查询的JsonNode对象,然后转换为列表

ObjectMapper mapper = new ObjectMapper();
JsonNode jsonObject = mapper.readTree(form.getFieldList());
ArrayNode fieldListArray = (ArrayNode) jsonObject.get("fieldList");
if (fieldList != null) {
    FieldDefType[] listOfFieldDefs = mapper.convertValue(fieldList, FieldDefType[].class);
    if (listOfFieldDefs != null) {
        request.setFieldList(Arrays.asList(listOfFieldDefs));
    }
}

解决方案 2:使用 TypeReference 从 JSON 映射到 POJO 对象,然后从那里检索我的字段。

FieldListModel fieldListModel = new FieldListModel();
ObjectMapper mapper = new ObjectMapper();
fieldListModel = mapper.readValue(form.getFieldList(), new FieldListTypeReference());
request.setFieldList(fieldListModel.getEntries());

// At bottom of this class I have my named static inner class - Sonar scan requested this
static class FieldListTypeReference extends TypeReference<FieldListModel> {}

我倾向于解决方案 1,因为不需要命名的静态内部类,而且我在 Stack Overflow 上听说 TypeReference 很慢。我能想到的解决方案 1 的唯一问题是需要更多的空检查和更多的代码行。

标签: javagenericsjacksonjackson2jackson-databind

解决方案


推荐阅读