使用 Jackson 反序列化对象列表

Deserialize a list of objects with Jackson

我有一个对象列表,每个对象都有指定的字段(变量类型),所以我想我将创建一个带有共享元素(变量)的主 class(super class) ) 和两个 subclasses 用于特定类型的变量。 我想将所有 Subclasses 反序列化为 superclass 的类型,以便我可以将所有这些 Jsons 放入相同对象的列表中。

这是我的例子Json

[ { "query": "age", "type": "numeric", "min": 5, "max": 99 }, { "query": "diagnosis", "type": "string", "in": ["husten", "schnupfen"] } ]

我写的反序列化代码是:

public class Query{
    private String query;
    private String type;
    // Getters and Setters and constructor
}

public class QueryString extends Query implements Serializable {
    private List<String> in;
    private String like;
    // Getters and Setters and constructor
}

public class QueryNum extends Field implements Serializable {
    private Number min;
    private Number max;
    // Getters and Setters and constructor
}

使用 ObjectMapper 的序列化按预期工作,但通过反序列化,编译器告诉我有一个无法识别的值(这是我的子类的字段)。

我想获取对象列表(查询) 包含 QueryString 和 QueryNum 的列表。

杰克逊 Json 在 Java 中有可能吗?

对于我使用的反序列化:

    ObjectMapper mapper = new ObjectMapper();

    List<Query> queries= Arrays.asList(mapper.readValue(JsonString, Query[].class));

提前致谢

如果每个对象中都有一个字段可用于识别要构建的对象,则可以使用注释 @JsonTypeInfo:

Annotation used for configuring details of if and how type information is used with JSON serialization and deserialization, to preserve information about actual class of Object instances. This is necessarily for polymorphic types, and may also be needed to link abstract declared types and matching concrete implementation.

@JsonSubTypes

Annotation used with JsonTypeInfo to indicate sub types of serializable polymorphic types, and to associate logical names used within JSON content (which is more portable than using physical Java class names).

或者 JsonTypeName:

Annotation used for binding logical name that the annotated class has. Used with JsonTypeInfo (and specifically its JsonTypeInfo.use() property) to establish relationship between type names and types.

基本上你需要定义一个 属性 来保存与要在 @JsonTypeInfo 中实例化的 class 相关的信息,并在 @JsonSubTypes[= 中定义可能的值23=]

这是一个例子

@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME, 
  include = As.PROPERTY, 
  property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Dog.class, name = "dog"),
    @JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public class Animal {
    // The property type is used to know what object instantiate
    private String type;
    ...
}

@JsonTypeName("dog")
public class Dog extends Animal {
    ...
}

@JsonTypeName("cat")
public class Cat extends Animal {
    ...
}

如果您没有这样的字段,您需要创建一个自定义反序列化器。

另一种方法是将您的记录转换为 Map 的列表,因为 Map 可以包含任何有效对象。