gpt4 book ai didi

java - 在自定义反序列化器中调用默认反序列化器不会影响实例

转载 作者:太空宇宙 更新时间:2023-11-04 09:36:57 25 4
gpt4 key购买 nike

我正在尝试将 Json 反序列化为进程中的现有实例。因此,如果不存在,它只会创建一个新实例。所有对象都包含一个 id 来识别它们。

我使用了这个答案:https://stackoverflow.com/a/18405958/11584969并尝试为此创建一个自定义反序列化器。

到目前为止,我已经成功创建了一个自定义反序列化器来检查现有实例,但我无法填充新实例或更改现有实例。

我的反序列化函数是:

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); 填充;

如果我不使用自定义反序列化器,创建的实例将按预期填充。

最佳答案

这并不是问题的答案,但我最初的目标是:

'm trying to deserialize a Json into an existing instance in my process. So it only creates a new instance if none exists. Alls objects contains an id to Identifiy them.

对于每个尝试实现相同目标的人,以下是我的实现方式:

public class ModelInstantiator extends StdValueInstantiator {

private static final long serialVersionUID = -7760885448565898117L;

private Class<? extends ModelObject> clazz;

/**
* @param config
* @param valueType
*/
public ModelInstantiator(DeserializationConfig config, Class<? extends ModelObject> clazz) {
super(config, config.constructType(clazz));

this.clazz = clazz;
}

@Override
public boolean canCreateFromObjectWith() {
return true;
}

@Override
public Object createFromObjectWith(DeserializationContext ctxt, Object[] args) throws IOException, JsonProcessingException {
UUID id = (UUID) args[0];

// get local object
ModelObject object = ...

// if id was not found => create and add
if (object == null) {
try {
object = clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new IOException(e);
}

object.setId(id);
// add to local list
...
}

return object;
}

@Override
public SettableBeanProperty[] getFromObjectArguments(DeserializationConfig config) {
CreatorProperty idProp = new CreatorProperty(new PropertyName("id"), config.constructType(UUID.class), null, null, null, null,
0, null, PropertyMetadata.STD_REQUIRED);

return new SettableBeanProperty[] { idProp };
}

}

我必须拆分本地 ID 和 json ID。否则数组中的 id 为空。

关于java - 在自定义反序列化器中调用默认反序列化器不会影响实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56402032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com