Отображение Json Array в POJO с использованием Jackson - PullRequest
1 голос
/ 20 марта 2019

У меня есть массив JSON в форме:

[
 [
  1232324343,
  "A",
  "B",
  3333,
  "E"
 ],
 [
  12345424343,
  "N",
  "M",
  3133,
  "R"
 ]
]

Я хочу сопоставить каждый элемент родительского массива с POJO, используя библиотеку Джексона.Я попробовал это:

ABC abc = new ABC();
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(data).get("results");

if (jsonNode.isArray()) {
    for (JsonNode node : jsonNode) {
        String nodeContent = mapper.writeValueAsString(node);
        abc = mapper.readValue(nodeContent,ABC.class);

        System.out.println("Data: " + abc.getA());
    }
}

, где ABC - это мой класс POJO, а abc - это объект, но я получаю следующее исключение:

com.fasterxml.jackson.databind.JsonMappingException:Не удается десериализовать экземпляр com.demo.json.model.ABC

РЕДАКТИРОВАТЬ: Мой POJO выглядит следующим образом:

class ABC{
    long time;
    String a;
    String b;
    int status;
    String c;
}

Может кто-нибудь предложить решение для этого?

РЕДАКТИРОВАТЬ 2: просмотрев множество ответов на StackOverflow и других форумах, я нашел одно решение.Я отобразил возвращенное значение метода readValue () в массив объектов POJO.

ABC[] abc = mapper.readValue(nodeContent, ABC[].class);

Но теперь я получаю отдельное исключение

Невозможно создать экземпляр ABC:нет конструктора / метода длинных аргументов / метода фабрики для десериализации из числового значения (1552572583232)

Я пробовал следующее, но ничего не получалось: 1. Принудительное использование Джексоном целочисленных значений для длинных значений с использованием

mapper.configure(DeserializationFeature.USE_LONG_FOR_INTS, true);

2.Использование класса-оболочки Long вместо long в POJO

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Вы можете использовать ARRAY форму для этого объекта.Вы можете сделать это, используя JsonFormat аннотацию:

@JsonFormat(shape = Shape.ARRAY)
class ABC {

и десериализовать его:

ABC[] abcs = mapper.readValue(json, ABC[].class);

РЕДАКТИРОВАТЬ после внесения соответствующих изменений.

Ваш пример кода может выглядеть следующим образомэто:

JsonNode jsonNode = mapper.readTree(json);
if (jsonNode.isArray()) {
    for (JsonNode node : jsonNode) {
        String nodeContent = mapper.writeValueAsString(node);
        ABC abc = mapper.readValue(nodeContent, ABC.class);

        System.out.println("Data: " + abc.getA());
    }
}

Мы можем использовать convertValue метод и пропустить процесс сериализации:

JsonNode jsonNode = mapper.readTree(json);
if (jsonNode.isArray()) {
    for (JsonNode node : jsonNode) {
        ABC abc = mapper.convertValue(node, ABC.class);
        System.out.println("Data: " + abc.getA());
    }
}

Или даже:

JsonNode jsonNode = mapper.readTree(json);
ABC[] abc = mapper.convertValue(jsonNode, ABC[].class);
System.out.println(Arrays.toString(abc));
1 голос
/ 20 марта 2019

Ваш json не отображается в pojo, которое вы определили.Для заданного вами pojo json должен иметь вид ниже.

{ 
  "time:1232324343,
  "a":"A",
  "b":"B",
  "status":3333,
  "c":"E"
}
...