gpt4 book ai didi

java - 创建类型感知的 Jackson 反序列化器

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

我想配置一个 Jackson 反序列化器,它根据注释字段的目标类型而采取不同的行为。

public class Car {
@JsonSerialize(using=IdSerializer.class)
@JsonDeserialize(using=IdDeserializer.class)
String id
}

public class Bus {
@JsonSerialize(using=IdSerializer.class)
@JsonDeserialize(using=IdDeserializer.class)
Id id
}

Jackson 序列化器知道它转换数据的类型,因此这是有效的:

public class IdSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator jsonGen, SerializerProvider provider) throws IOException {

// value is the annotated field class
if(value instanceof String)
jsonGen.writeObject(...);
else if (value instanceof Id)
jsonGen.writeObject(...);
else
throw new IllegalArgumentException();
}
}

Jackson 反序列化器似乎不知道它将数据转换成的目标类型:

public class IdDeserializer extends JsonDeserializer<Object> {
@Override
public Object deserialize(JsonParser jp, DeserializationContext context) throws IOException {

// what is the annotated field class?
}
}

最佳答案

在序列化器中,您可以添加有关类型的额外信息,这将在反序列化过程中为您提供帮助。

从您发布的 IdSerializer 构建...

public class IdSerializer extends JsonSerializer<Object> {

@Override
public void serialize(Object value, JsonGenerator jsonGen, SerializerProvider provider) throws IOException {

// value is the annotated field class
if(value instanceof String){
jsonGen.writeStartObject();
jsonGen.writeFieldName("id");
jsonGen.writeObject(value);
jsonGen.writeFieldName("type");
jsonGen.writeString("String");
jsonGen.writeEndObject();
}
else if (value instanceof Id){
Id id = (Id) value;
jsonGen.writeStartObject();
jsonGen.writeFieldName("id");
jsonGen.writeString(id.getStuff());
jsonGen.writeFieldName("type");
jsonGen.writeString("Id");
jsonGen.writeEndObject();
}
else{
throw new IllegalArgumentException();
}
}
}

在反序列化器中,您可以解析此“类型”字段并返回正确的对象类型。

关于java - 创建类型感知的 Jackson 反序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12977144/

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