Десериализовать JSON со списком вложенных объектов - PullRequest
1 голос
/ 02 июня 2019

Я хочу десериализовать json в объект, который содержит список других объектов, используя jackson-databind.

Я пытаюсь десериализовать ниже json.У меня есть Class class1, и у него есть List<NestedProp>.Prop2 является архиватором.List<NestedProp> prop2.

Структура класса `

class Class1 {
  String prop1;
  List<NestedProp> prop2;
  //setters getters
}

class NestedProp {
  String p1;
  String p2;
  //setters getters
}
`

```
  "class1": {
    "prop1": "pp",
    "prop2": [
      {
        "nestedProp": [
          {
            "p1": "127",
            "p2": "1"
          },
          {
            "p1": "128",
            "p2": "2"
          }
        ]
      }
    ]
  }

While deserialisingI get the below exception:

>com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `NestedProp` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('127')
 at [Source: (File); line: 59, column: 7] (through reference chain: java.util.ArrayList[1]->Class1["prop2"]->java.util.ArrayList[0])


    List<Class1> testData = objectMapper.readValue(test.json, Class1.class);

1 Ответ

0 голосов
/ 03 июня 2019

У вас есть два массива в ваших JSON полезных нагрузках.Итак, вам нужно создать дополнительные POJO для него.См. Пример ниже:

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.util.List;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        Root root = mapper.readValue(jsonFile, Root.class);
        System.out.println(root);
    }
}

class Root {

    private Class1 class1;

    //getters, setters, toString
}

class Class1 {

    private String prop1;
    private List<NestedProps> prop2;

    //getters, setters, toString
}

class NestedProps {

    private List<NestedProp> nestedProp;

    //getters, setters, toString
}

class NestedProp {
    private String p1;
    private String p2;

    //getters, setters, toString
}

Ниже JSON:

{
  "class1": {
    "prop1": "pp",
    "prop2": [
      {
        "nestedProp": [
          {
            "p1": "127",
            "p2": "1"
          },
          {
            "p1": "128",
            "p2": "2"
          }
        ]
      }
    ]
  }
}

Приведенный выше пример печатает:

Root{class1=Class1{prop1='pp', prop2=[NestedProps{nestedProp=[NestedProp{p1='127', p2='1'}, NestedProp{p1='128', p2='2'}]}]}}

См. Также:

...