Как десериализовать вложенный JSON в POJO - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть JSON-ответ с массивом.Внутри этого массива у меня есть поля. Я хочу сопоставить поле с полем объекта, а также хочу сопоставить другие поля с другим POJO

. Я создал One Phone POJO и Memory POJO.Я пытался сопоставить эти вещи с помощью PhoneWrapper Pojo.Я могу сопоставить его с несколькими циклами, но мне нужен эффективный способ сопоставления.

class Phone{
     long id;
     Memory memory;
     String name;
   //Constructor 
   // getters and setters
}

class Memory{
     long id;
     String type;
       //constructor
      //getters & setters
}
// my Json
String json = {"data":[{"id":1,"name":"samsung","memoryId":32432},
{"id":2,"name":"apple","memoryId":34534}
]}

Class myWrapper{
     List<Phone> phones;
     List<Memory> memory;
     //getter and setter
}
public void mapper(String json)
JsonNode root = objectMapper.readTree(json);
                myWrapper.setPhones(objectMapper.readValue(root.path("data").toString(), new TypeReference<List<Phone>>() {}));


Я хочу, чтобы tp сопоставил этот идентификатор объекта json, имя с samsung pojo и memory_id с samsung POJO в памяти POJO Id, когда я вызываю samsung.getMemory (). getId () Я хочу получить этот memory_id

1 Ответ

0 голосов
/ 19 сентября 2019

Используйте библиотеку Джексона

@Test
public void shouldAnswerWithTrue() throws IOException {

    String json = "{\"data\":[{\"id\":1,\"name\":\"samsung\",\"memoryId\":32432},{\"id\":2,\"name\":\"apple\",\"memoryId\":34534}]}";

    ObjectMapper objectMapper = new ObjectMapper();

    SimpleModule simpleModule = new SimpleModule();

    simpleModule.addDeserializer(Data.class, new DataDeserializer());

    objectMapper.registerModule(simpleModule);

    Data data = objectMapper.readValue(json, Data.class);

    Assert.assertEquals(data.getData().stream().findFirst().get().getMemory().getId(), 32432l);
}

И используйте этот десериализатор данных:

class DataDeserializer extends StdDeserializer<Data> {

public DataDeserializer() {
    this(null);
}

public DataDeserializer(Class<?> vc) {
    super(vc);
}

@Override
public Data deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
    JsonNode node = jp.getCodec().readTree(jp);

    Iterator<JsonNode> iterator = node.get("data").iterator();
    List<Phone> phones = new ArrayList<>();

    System.out.println(node.asText());

    while (iterator.hasNext()) {
        JsonNode item = iterator.next();
        Phone phone = new Phone();

        phone.setId(item.get("id").asLong());
        phone.setName(item.get("name").asText());

        Memory memory = new Memory();
        memory.setId(item.get("memoryId").asLong());

        phone.setMemory(memory);
        phones.add(phone);
    }

    Data data = new Data();
    data.setData(phones);
    return data;
}

Pojos:

@Getter
@Setter
@ToString
class Data {
    private List<Phone> data;
}

@Getter
@Setter
@ToString
class Phone {
    long id;
    Memory memory;
    String name;
}

@Getter
@Setter
@ToString
class Memory {
    long id;
    String type;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...