【发布时间】:2018-07-15 03:00:54
【问题描述】:
我想通过扩展默认值并在其后设置更多值来制作自己的反序列化器:
simplified code:
public class Dto {
public String originalJsonString;
}
public MyFooDto extends Dto {
public String myField;
}
@Bean
public ObjectMapper deserializingObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addDeserializer(MyFooDto.class, new JsonDtoDeserializer<>());
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}
// or maybe instead of the Beam just @JsonDeserialize(using = JsonDtoDeserializer.class) before MyFooDto?
public class JsonDtoDeserializer<T extends Dto> extends StdDeserializer<T> {
// or maybe extends JsonDeserializer? or UntypedObjectDeserializer? or UntypedObjectDeserializer.Vanilla?
public T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
// here I would like:
T item = super.deserialize"AsUsual"(p, ctxt);
// the difficulty is to avoid the loop of death, where the deserializer would call itself for the eternity...
// And then set other Dto-fields depending on the original Json input, for example:
item.originalJsonString = p.readValueAsTree().toString();
return item;
}
}
如你所见,我也想为其他 DTO 重用这个 Dto 母类。
- 我没有找到任何例子。我真的是世界第一吗?
- 反序列化“AsUsual”(p, ctxt) 应该是什么?
- 我应该使用什么motherclass? JsonDeserializer / StdDeserializer / UntypedObjectDeserializer?
- 反序列化器会知道它必须实例化哪个类的 T 吗?
感谢社区!
【问题讨论】:
-
mother class的正确术语是super class -
关于反序列化“AsUsual”见stackoverflow.com/questions/18313323/…
标签: java spring spring-boot jackson json-deserialization