反序列化时MyEntity
(这是一个接口)我要么有
-
以下输入:
{ "id": 123 }
在这种情况下,我想将其反序列化为
new MyEntityRef(123)
-
或者我有以下输入:
{
"id": 123,
"message": "Hello world",
"otherEntity": {
"field": "value",
...
}
}
在这种情况下我想将其反序列化为
new MyEntityImpl(123, "Hello world", otherEntity);
where otherEntity
反序列化的方式与在上下文之外找到它的方式相同MyEntity
.
我已经弄清楚如何通过注册我自己的自定义反序列化器SimpleModule
但我不知道该怎么做
- 根据某些字段的存在选择自定义解串器(例如
message
above).
- 某些字段的“默认”序列化器的回退(例如
otherEntity
above).
最后通过配置我的 ObjectMapper 解决了这个问题,如下所示:
ObjectMapper mapper = new ObjectMapper();
SimpleModule idAsRefModule = new SimpleModule("ID-to-ref",
new Version(1, 0, 0, null));
idAsRefModule.addDeserializer(TestEntity.class,
new JsonDeserializer<TestEntity>() {
@Override
public TestEntity deserialize(JsonParser jp, DeserializationContext dc)
throws IOException, JsonProcessingException {
ObjectCodec codec = jp.getCodec();
JsonNode node = codec.readTree(jp);
boolean isFullImpl = node.has("message");
Class<? extends TestEntity> cls = isFullImpl ? TestEntityImpl.class
: TestEntityRef.class;
return codec.treeToValue(node, cls);
}
});
mapper.registerModule(idAsRefModule);
return mapper;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)