При анализе вложенного JSON с использованием Jackson какой метод является предпочтительным: ArrayNode или TypeReference? - PullRequest
0 голосов
/ 05 ноября 2018

Я должен разобрать следующий 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, так как нет необходимости в именованном статическом внутреннем классе, и я слышал по переполнению стека, что TypeReference работает медленно. Единственные проблемы с решением 1, о которых я могу думать, - это необходимость в дополнительных проверках нуля и большем количестве строк кода.

...