Как настроить упакованный ключ json для класса во время десериализации, если я не могу пометить этот класс аннотацией? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть такой класс модели:

import org.codehaus.jackson.map.*;

public class MyPojo {
    int id;
    public int getId()
    { return this.id; }

    public void setId(int id)
    { this.id = id; }


}

И у json json такой формат:

{ 
    "root":{  
       "MyPojo":{  
          "id":4
       }
    }
}   

Я читаю о решении с помощью аннотаций @JsonTypeInfo или @JsonRoot, но я не могу применить это, потому что я беру этот класс из библиотеки.

Также я читал о решении, как это:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);

Но я не могу его использовать, потому что:
1. Это настройка для всех классов, но мне нужно изменить поведение только для 1 класса прямо сейчас
2. Он проверит, что корневой ключ соответствует имени класса (mypojo в моем случае), но мне это не соответствует действительности.

Есть идеи?

1 Ответ

0 голосов
/ 29 октября 2018

Способ заключается в добавлении десериализатора. Там вы можете программно манипулировать json, чтобы создать свой MyPojo экземпляр

public class MyPojoDeserializer extends StdDeserializer<MyPojo> {

    @Override
    public Item deserialize(JsonParser jp, DeserializationContext ctxt) {
        JsonNode node = jp.getCodec().readTree(jp);
        return new MyPojo(node.get("root").get("MyPojo").get("id").numberValue());
    }
}

затем зарегистрируйте десериализатор

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(MyPojo.class, new MyPojoDeserializer());
mapper.registerModule(module);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...