gpt4 book ai didi

java - Jackson - BeanDeserializerBase

转载 作者:行者123 更新时间:2023-12-01 10:02:17 25 4
gpt4 key购买 nike

我正在尝试向 Jackson 添加特定功能。

我希望 Jackson 能够反序列化对象,而无需询问所需的类型。我的意思是我希望能够序列化一个类并附加一个“@class”属性,该属性将保存反序列化时要使用的类名。

我能够毫无问题地附加类属性来构建自定义 BeanSerializerBase,但我找不到任何方法来构建我的 BeanDeserializerBase 并使其工作。我找不到任何函数可以让我提取“@class”字段并将其从需要传递给默认反序列化器的 JsonParser 中删除,该默认反序列化器将让我决定输出类。

@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
while(!p.isClosed())
{
JsonToken t = p.nextToken();

if(t.name() == "@class")
{
String cls = t.asString();

try
{
Class<?> clazz = Class.forName(cls);

// remove @class field & default deserialize.
}
catch (ClassNotFoundException e)
{

}
}
}
}

有人能帮我吗?因为我真的被困住了!谢谢。

最佳答案

而不是覆盖 BeanDeserializerBase你可以打开 jackson 的global default typing这适用于所有类(class)。这是一个例子:

public class JacksonTypeInfo {
public static class Bean {
public final String key;

@JsonCreator
public Bean(@JsonProperty("key") final String key) {this.key = key;}
}

public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper()
.enableDefaultTypingAsProperty(
ObjectMapper.DefaultTyping.NON_FINAL,
"@class");
final String json = objectMapper.writeValueAsString(new Bean("value"));
System.out.println(json);
System.out.println(objectMapper.readValue(json, Object.class));
}
}

输出:

{"@class":"stackoverflow.JacksonTypeInfo$Bean","key":"value"}
stackoverflow.JacksonTypeInfo$Bean@271053e1

关于java - Jackson - BeanDeserializerBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36705400/

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