десериализация списка объектов json object с помощью jackson - не может десериализовать экземпляр из маркера start_array - PullRequest
0 голосов
/ 07 июля 2019

Я читаю ответ JSON от Mandrill API Mailchimp с Джексоном. Ответ немного необычен для ответа API в том смысле, что он включает в себя рули внутри квадратных скобок - список объектов. Другие обсуждения переполнения стека вокруг этой ошибки относятся к ответам API, которых нет в списке.

[
    {
        "email": "gideongrossman@gmail.com",
        "status": "sent",
        "_id": "6c6afbd3702f4fdea8de690c284f5898",
        "reject_reason": null
    }
]

Я получаю эту ошибку ...

2019-07-06 22:41:47.916 DESKTOP-2AB6RK0 org.groundlist.core.RestClient 131222 ERROR com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `org.groundlist.core.user.MandrillWrapper$TemplatedEmailResponse` out of START_ARRAY token

Как правильно определить этот объект ответа?

Я попытался определить ответ следующими типами. Никто не работал.

public static class TemplatedEmailResponse {
    public LinkedHashMap<String, String>[] response;
}




public static class TemplatedEmailResponse {
    public ArrayList<LinkedHashMap<String, String>> response;
}

@ milchalk ... Как именно я могу использовать ваше предложение объектного сопоставления с тем, как я сейчас вызываю API и обрабатываю ответ?

TemplatedEmailResponseList ret = getClient("messages/send-template.json").post(mandrillPayload,
            TemplatedEmailResponseList.class);

, где

public <T> T post(Object payload, Class<T> responseType) {
    try {
        Entity<Object> entity = Entity.entity(payload, MediaType.APPLICATION_JSON);
        T t = client.target(url).request(MediaType.APPLICATION_JSON).post(entity, responseType);
        return t;
    } catch (Throwable t) {
        logError(t);
        throw t;
    } finally {
        client.close();
    }
}

1 Ответ

1 голос
/ 07 июля 2019

Вы можете десериализовать этот json напрямую в List ваших классов Pojo.

Данный класс модели:

public class TemplatedEmailResponse {
    private String email;
    private String status;
    private String _id;
    private String reject_reason;
    //getters setters
}

Вы можете десериализовать этот JSON, используя TypeReference для List<TemplatedEmailResponse>:

ObjectMapper mapper = new ObjectMapper();
TypeReference<List<TemplatedEmailResponse>> typeRef = new TypeReference<List<TemplatedEmailResponse>>() {};
List<TemplatedEmailResponse> list = mapper.readValue(json, typeRef);

Где json переменная представляет строку json в этом случае.

...