gpt4 book ai didi

java - Jackson 序列化程序在序列化后不显示 jsonInfoType

转载 作者:行者123 更新时间:2023-11-30 08:49:37 26 4
gpt4 key购买 nike

我有一个基类和一个派生类,如下所示

@JsonTypeInfo(use = JsonTypeInfo.Id.MINIMAL_CLASS,
include =JsonTypeInfo.As.PROPERTY, property = "_type")
@JsonSubTypes({ @JsonSubTypes.Type(value = BaseClass.class,
name = "BaseClass")})
public class BaseClass{
private String a;
}


public class DerivedClass extends BaseClass{
private String b;
}

当我序列化 BaseClass 列表或 DerivedClass 列表时,我无法在我的 json 中找到“_type”属性。但是,如果我序列化 BaseClass 或 Derived 类的单个实例,我可以看到“_type”属性。

这是我的序列化程序代码。

public void serialize() throws Exception {

List<DerivedClass> bs = new ArrayList<DerivedClass>();
bs.add(new DerivedClass());
bs.add(new DerivedClass());
String json = new ObjectMapper().writeValueAsString(bs);
LOG.debug(json);
}

最佳答案

问题是由于 Java 类型删除,Jackson 看到的都是 List<Object> , 关于类型。自 Object没有@JsonTypeInfo ,它认为不需要类型信息——所有值必须使用相同的逻辑基类型,因为在反序列化期间没有实例,并且必须使用静态已知类型作为基线。

那么如何解决这个问题呢?

首先:我的建议是始终使用简单、非通用的 POJO 作为根值,从而完全避免该问题。任何List从 POJO 获得的有值(value)的属性将具有完整的类型信息;根值没有。因此,我避免直接​​序列化 List s 和 Map s,以及通用(参数化)POJO。

但是,如果您仍然想解决更难的问题,这也是可行的。两种主要方式:

第一种方法:创建一个便利类,例如:

public class ListOfBase extends ArrayList<BaseClass> { }
ListOfBase myList = new ListOfBase();
myList.add(...);

它将按预期工作,带有类型信息

第二种方法:强制使用特定的基类型,通过 ObjectWriter :类似:

ObjectWriter w = mapper.writerFor(new TypeReference<List<BaseClass>>() { });
String json = w.writeValueAsString(myList);

但这(不幸的是)也会强制使用 BaseClass对于实际内容,而不仅仅是键入信息。因此,不包括实现类的任何属性。

其实还有第三种选择:使用Java数组,而不是集合。数组是强类型的,所以这也适用:

BaseClass[] stuff = new BaseClass[] { value1, value2 };

因为保留了类型信息,不像通用的 List

关于java - Jackson 序列化程序在序列化后不显示 jsonInfoType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31351097/

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