Джексон получает список с карты, где ключ содержит путь (например, «child_1_name») - PullRequest
0 голосов
/ 30 января 2019

Наша точка интеграции возвращает нам следующую структуру

{
  "veryImportantProperty":"some value",
  "child_1_name": "Name1",
  "child_1_age": 15,
  "child_2_name": "Name2",
  "child_2_age": 18
}

Мы хотели бы проанализировать это для следующих классов:

class Child {
  @NotEmpty
  private String name;
  @NotNull
  private Integer age;
}

class Wrapper{
  @NotEmpty
  private String veryImportantProperty;
  @Valid
  private List<Child> children;
}

Есть ли плагин / конфигурация для Джексонакоторый может сделать это для меня?

Спасибо

1 Ответ

0 голосов
/ 30 января 2019

Вы можете определить пользовательский Deserializer, расширив StdDeserializer :

class WrapperDeserializer extends StdDeserializer<Wrapper> {

    public WrapperDeserializer() {
        this(null);
    }

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

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


        String veryImportantProperty = node.get("veryImportantProperty").asText();
        List<Child> children = new ArrayList<Child>();
        int iChild = 1;
        Child child;
        while(node.has("child_"+iChild+"_name")) {
            child = new Child();
            child.setName(node.get("child_"+iChild+"_name").asText());
            child.setAge(node.get("child_"+iChild+"_age").asInt());
            children.add(child);
            iChild++;
        }

        Wrapper wrapper = new Wrapper();
        wrapper.setVeryImportantProperty(veryImportantProperty);
        wrapper.setChildren(children);
        return wrapper;
    }
}

И аннотировать свой класс Wrapper с помощью @ JsonDeserialize , чтобы использовать свой пользовательскийДесериализатор

@JsonDeserialize(using = WrapperDeserializer.class)
class Wrapper {
    ...
}

Затем вы можете десериализовать в одну строку, используя ObjectMapper.readValue метод

ObjectMapper mapper = new ObjectMapper();
Wrapper wrapper = null;
try {
    wrapper = mapper.readValue(json, Wrapper.class);
} catch (Exception e) {
    System.out.println("Something went wrong:" + e.getMessage());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...