Десериализовать массив JSON в десериализованном массиве JSON с использованием Джексона - PullRequest
0 голосов
/ 10 июля 2020

У меня есть JSON со структурой:

{
  "id" : "123",
  "name" : [ {
    "id" : "234",
    "stuff" : [ {
      "id" : "345",
      "name" : "Bob"
    }, {
      "id" : "456",
      "name" : "Sally"
    } ]
  } ]
}

Я хочу сопоставить со следующей структурой данных:

Class01

@Getter
public class Class01{
    private String id;
    @JsonDeserialize(using = Class01HashMapDeserialize.class)
    private ArrayList<Class02> name;
}

Class02

@Getter
public class Class02{
    private String id;
    private ArrayList<Class03> stuff;
}

Class03

@Getter
public class Class03{
    private String id;
    private String name;
}

В моем основном методе я использую ObjectMapper с objectMapper.readValue(jsonString,new TypeReference<ArrayList<Class02>>(){}), чтобы сопоставить этот JSON с моим Class01. Этот класс успешно десериализует массив Class02 в массив имен.

Когда дело доходит до второго массива, я не знаю, как дальше десериализовать, поскольку я не могу получить доступ к тексту json из class02 запись материала.

@Override
public ArrayList<Class02> deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException {
    ArrayList<Class02> ret = new ArrayList<Class02>();

    ObjectCodec codec = parser.getCodec();
    TreeNode classes02 = codec.readTree(parser);

    if (classes02.isArray()) {
        for (JsonNode class02 : (ArrayNode) classes02) {
            if(classe02.get("stuff").isArray()){
                 ObjectMapper objectMapper = new ObjectMapper();
                 ArrayList<Class03> classes03 = objectMapper.readValue(class02.get("stuff").asText(), new TypeReference<ArrayList<Class03>>(){});
            }
            ret.add(new Class02(class02.get("id").asText(), classes03));
        }
    }
    return ret;
}

1 Ответ

1 голос
/ 10 июля 2020

Почему вы разместили аннотацию @JsonDeserialize? Джексон сможет десериализовать его без каких-либо настраиваемых сопоставлений:

@Getter
public class Class01{
    private String id;
    private ArrayList<Class02> name;
}

Также на первом проходе я бы вручную сгенерировал геттеры / сеттеры / конструктор для 3 классов. Могут возникнуть проблемы с Lombok & Jackson, которые вы, возможно, захотите решить позже, когда первая версия кода заработает ( Не удается заставить Джексона и Lombok работать вместе )

И ваш читатель должен быть больше похож на:

ObjectMapper objectMapper = new ObjectMapper();
String text = ... //Your JSon
Class01 class01 = objectMapper.readValue(text, Class01.class)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...