Десериализация сложного файла json в POJO — работает либо как один элемент списка, либо нет

#java #json #spring-boot #jackson #json-deserialization

#java #json #весенняя загрузка #джексон #json-десериализация

Вопрос:

Я пытаюсь десериализовать этот json в класс POJO, чтобы тогда я мог управлять объектами. JSON:

 {
 "something": "x",
 "items": [
  {
   "type": "y",
   "id": "123",
   "otherInfo": {
    "tag": "abc",
    "otherId": [
     {
      "first": "qaz",
      "second": "zaq"
     },
     {
[...]
  

Существует более 10 элементов, подобных этому.
Я хотел десериализовать его, поэтому я использовал jsonschema2pojo, создал такие классы, как Item и otherInfo, с геттерами, установщиками и конструкторами.

Затем я создал ObjectMapper в моем классе DAO:

 ObjectMapper mapper = new ObjectMapper();
    Item items;
    {
        try {
            items = mapper.readValue(new File("path/file.json"), Item.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Item getAllItems(){
       return items;
    }
  

Таким образом, я получаю пустой вывод.
При изменении элемента на Item[] я получаю «Исключение MismatchedInputException» из-за «чего-то», которое находится над «элементами» в моем JSON.

Когда я попытался обратиться к классу POJO, который находится на один уровень выше элемента, я получил весь JSON в виде одного элемента массива со всем, что находится внутри него. Это очевидно, но это показывает, что ObjectMapper работает корректно.

Существует ли какой-либо простой или эффективный способ десериализации JSON, подобный этому?

Комментарии:

1. Зачем note создавать еще один родительский класс с атрибутом «Something» И списком элементов, а затем пытаться десериализовать этот родительский объект?

2. Спасибо за ваш ответ. Возможно, это вариант. Не могли бы вы предоставить более подробную информацию о десериализации родительского объекта? Я не думаю, что полностью понимаю, что вы имеете в виду. Кстати. нет ли способа «пропустить» «что-то» и просто десериализовать все элементы? Редактировать: На самом деле, это даже не работает с полностью удаленным «чем-то»…

Ответ №1:

Вы можете создать родительский объект, который содержит ArrayList для представления массива элементов.

Например:

 public class MyParentObject {
    String something;
    ArrayList<Item> items;
    public ArrayList<Item> getItems() {
       return items;
    }
    // the rest of your getters/setters
}

// the object mapper line becomes:
MyParentObject parentObject = mapper.readValue(new File("path/file.json"), MyParentObject.class);

ArrayList<Item> items = parentObject.getItems();
  

С помощью десериализации JSON массивы JSON могут быть напрямую сопоставлены с ArrayList.

Комментарии:

1. Спасибо за ваш ответ. Я попытался реализовать это решение, и я получаю «нестатический метод GetItems (), на который нельзя ссылаться из статического контекста», указывающий на ArrayList<Item> items = ParentObject.GetItems();

2. Вы определили метод GetItems?

3. Да, я сделал, точно так же, как вы сделали в edit. Однако я добавил @JsonProperty («элементы»). Редактировать: Хорошо, подождите. Я все перепутал. Дайте мне секунду, кажется, теперь это работает.

4. Спасибо 🙂 Теперь он работает безупречно. Если позволите — у меня есть еще один вопрос: что мне теперь делать, если, например, я хотел бы напечатать только эти элементы, у которых otherId / first равен «xyz»? Должен ли я сделать что-то вроде «ParentObject.GetItems().get() […]»?

5. Нет проблем. Что касается вашего второго вопроса, вы хотите знать, как выполнить итерацию по списку массивов и распечатать только то содержимое, которое соответствует определенным критериям? Это звучит не по теме из этого поста. Возможно, вы захотите выполнить поиск или опубликовать другой вопрос отдельно.