【发布时间】:2019-05-31 21:45:06
【问题描述】:
我正在尝试将 Json 反序列化为我的流程中的现有实例。所以它只在不存在的情况下创建一个新实例。 Alls 对象包含一个 id 来识别它们。
我使用了这个答案:https://stackoverflow.com/a/18405958/11584969 并尝试为此创建一个自定义解串器。
到目前为止,我已经设法创建了一个 custon Deserializer 来检查现有实例,但我无法填充新实例或更改现有实例。
我的反序列化函数是:
public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
if (node instanceof NullNode) {
return null;
}
// get id from node
String strId = node.get("id").asText();
UUID id = UUID.fromString(strId);
// search for existing instance or create it
T mObject = ...
// fill/change instance
return (T) defaultDeserializer.deserialize(jp, ctxt, mObject);
}
对象映射器的创建:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enableDefaultTyping();
objectMapper.registerModule(new Jdk8Module());
objectMapper.registerModule(new JavaTimeModule());
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
if (beanDesc.getBeanClass() == Table.class)
return new ModelObjectDeserializer<>(Table.class, (JsonDeserializer<Table>) deserializer);
return deserializer;
}
});
objectMapper.registerModule(module);
上面的代码运行没有任何错误或异常,但是来自 mObject 的实例没有被 defaultDeserializer.deserialize(jp, ctxt, mObject); 填充;
如果我不使用自定义反序列化器,创建的实例将按预期填充。
【问题讨论】:
标签: java json jackson json-deserialization