gpt4 book ai didi

java - 无法使用(反)序列化 Jackson 中具有多态项的列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:00:05 51 4
gpt4 key购买 nike

我有一个问题(反)序列化 JSON,这不是我定义的。

这里有一些代码和 JSON 解释了这个问题:

代码:

public static class Base {
public String klass = "base";
}

public static class SubBase extends Base {
}

public static class Sub1 extends SubBase {
public Sub1() {
klass = "Sub1";
}
}

public static class Sub2 extends SubBase {
public Sub2() {
klass = "Sub2";
}
}

public static class Holder {
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_ARRAY, property="type")
@JsonSubTypes({@JsonSubTypes.Type (name = "sub1", value = Sub1.class),@JsonSubTypes.Type(name = "sub2", value = Sub2.class)})
public List<Base> items = new ArrayList<Base>();
}


Holder holder = new Holder();
holder.items.add(new Sub1());
holder.items.add(new Sub1());

mapper.writeValueAsString(holder);

产生

{"items":[["sub1",{"klass":"Sub1"}],["sub1",{"klass":"Sub1"}]]}

如果我将 JsonTypeInfo 注释更改为

    @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT, property="type")

产生

{"items":[{"sub1":{"klass":"Sub1"}},{"sub1":{"klass":"Sub1"}}]}

到目前为止,一切都很好:)

但是,我从服务器获取的 JSON 结构略有不同:

{"type":"sub1", "items":[{"klass":"Sub1"},{"klass":"Sub1"}]}

其中items数组的类型在“type”属性中定义(注意“items”数组中的所有项都属于同一类)。
我只是无法弄清楚要使用哪种 JsonTypeInfo 组合来实现这一点。我尝试将“include”设置为“.EXTERNAL_PROPERTY”,但这不起作用。
使用此包含反序列化会出现“线程“主”org.codehaus.jackson.JsonGenerationException 中的异常:无法写入字段名称,需要一个值”错误消息。

我的问题是:我需要使用哪个注释,以便 '{"type":"sub1", "items":[{"klass":"Sub1"},{"klass":"Sub1"}]}' 将根据 Holder 的“type”属性用所有 Sub1 实例填充“items”数组?
如果这是不可能的,是否有另一种方法来实现这一点(不需要 Holder 的自定义序列化程序;仅针对“items”数组的自定义序列化程序就可以了)?

谢谢!

最佳答案

无法映射您自动显示的 JSON;它不是 Jackson 支持的 4 种类型之一。

如果你不能让服务器产生更标准的结构(存在自动支持),你将需要编写一个自定义反序列化器;或者分两步进行数据绑定(bind),首先进入一个易于映射的中间结构(如 JsonNodeMap),然后从中进入所需的结构手动提取类型,使用(例如,使用 ObjectMapper.convertValue(object, resultType)

关于java - 无法使用(反)序列化 Jackson 中具有多态项的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15027628/

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