Java 使用生成的类和Jackson将JSON数据流读取到对象
我已经根据一个招摇过市的定义生成了类。共有4个不同的类,其中一个字段是公共的Java 使用生成的类和Jackson将JSON数据流读取到对象,java,json,jackson,Java,Json,Jackson,我已经根据一个招摇过市的定义生成了类。共有4个不同的类,其中一个字段是公共的op(没有类层次结构,每个类中都会复制该字段) 我想根据op字段的值,将JSON数据流反序列化为4个不同类中的一个 例如: {"op": "typeA", ...} -> generates TypeA {"op": "typeB", ...} -> generates TypeB 我想用杰克逊来做这个。我遇到的问题是,我找到的所有示例都假设您能够修改原始类,以便创建类层次结构来解决问题。然而,我的问题是,
op
(没有类层次结构,每个类中都会复制该字段)
我想根据op
字段的值,将JSON数据流反序列化为4个不同类中的一个
例如:
{"op": "typeA", ...} -> generates TypeA
{"op": "typeB", ...} -> generates TypeB
我想用杰克逊来做这个。我遇到的问题是,我找到的所有示例都假设您能够修改原始类,以便创建类层次结构来解决问题。然而,我的问题是,如何在不修改原始类的情况下解决这个问题
最初的示例假定一个层次结构,并按如下方式执行:
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "op",
visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = ConnectionMessage.class, name = "connection"),
@JsonSubTypes.Type(value = StatusMessage.class, name = "status"),
@JsonSubTypes.Type(value = MarketChangeMessage.class, name = "mcm"),
@JsonSubTypes.Type(value = OrderChangeMessage.class, name = "ocm"),
})
public interface MixInResponseMessage {
}
这可以通过带有switch-case语句的自定义反序列化程序来完成,以根据“op”字段的值解析正确的类型: 请注意如何使用
ObjectMapper
字段将TreeNode
转换为所需类型的对象
这不需要TypeA
、TypeB
等具有除对象
之外的任何其他公共父对象
有必要将此反序列化器指定为用于每个JSON元素,并带有一个“op”
字段。我通过解析此类进行了测试:
class Ops {
@JsonDeserialize(contentUsing = OpDeserializer.class)
Object[] ops;
}
不完全是答案,因为这假设了一个层次结构-但是你仍然可以通过使用mixin来接受这个想法(如果可能的话)。下面是一个使用mixin以父抽象类为目标的示例。
class Ops {
@JsonDeserialize(contentUsing = OpDeserializer.class)
Object[] ops;
}