Как создать соответствующие POJO для предоставленного ответа JSON? - PullRequest
0 голосов
/ 28 февраля 2020

сообщество! Я получил следующий JSON ответ от некоторого API:

[
    [
        [
            {
                "key": [
                    "1",
                    "test1"
                ],
                "value": 1582890257944
            },
            {
                "key": [
                    "2",
                    "test2"
                ],
                "value": 1582888081654
            },
            {
                "key": [
                    "3",
                    "test3"
                ],
                "value": 1582884771691
            }
        ]
    ]
]

Я должен создать классы для сопоставления этих JSON с Java классами. Ранее я получил следующие JSON:

[
    {
        "key": [
            "test1"
        ],
        "value": 1
    },
    {
        "key": [
            "test2"
        ],
        "value": 2
    }
]

и для этого JSON я создал простой класс:

public class SomeClass {

    private List<String> key;
    private int value;
}

и Джексон без проблем отобразил его правильно ...

Пожалуйста, помогите мне, какова структура Мне нужно для класса / классов? Я пытался написать что-то вроде этого:

        List<String> params = new ArrayList<>();
        params.add("1");
        params.add("test1");

        SomeClass someClass = new SomeClass();
        someClass.setKey(params);
        someClass.setValue(1L);

        List<SomeClass> arrays = new ArrayList<>();
        arrays.add(someClass);
        arrays.add(someClass);

        List<List<SomeClass>> arrayLists = new ArrayList<>();
        arrayLists.add(arrays);

        List<List<List<SomeClass>>> threeLists = new ArrayList<>();
        threeLists.add(arrayLists);

        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        String prettyJson = gson.toJson(threeLists);

        System.out.println(prettyJson);

И получил то же самое JSON, которое я получил из ответа ... Должен ли я создать класс со следующей структурой?

List<List<List<String>>> key;
long value;

но я получил ошибку от Джексона:

Исключение в потоке "main" com.faster xml .jackson.databind.ex c .MismatchedInputException: Невозможно десериализовать экземпляр main.entity.SomeClass из токена START_ARRAY в [ Источник: (StringReader); строка: 2, столбец: 5] (через цепочку ссылок: java .lang.Object [] [0])

1 Ответ

1 голос
/ 28 февраля 2020

Использование List<List<List<String>>> key не будет работать, так как структура Json равна List<List<List<SomeClass>>>, как это указано в примере кода.

Вы можете использовать класс Джексона TypeReference для десериализации. Пример кода с использованием jackson-databind.

public static void main(String[] args) {
    ObjectMapper mapper = new ObjectMapper();
    String json = "[[[{\"key\":[\"1\",\"test1\"],\"value\":1},{\"key\":[\"1\",\"test1\"],\"value\":1}]]]";
    TypeReference<List<List<List<SomeClass>>>> typeRef = new TypeReference<List<List<List<SomeClass>>>>() {
    };
    try {
        List<List<List<SomeClass>>> someClassList = mapper.readValue(json, typeRef);
        System.out.println(someClassList);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
...