【发布时间】:2021-07-08 08:29:15
【问题描述】:
我想使用 Jackson 将对象动态反序列化为适当的 java 类,但我无法以正确的方式配置 Jackson。
我有以下简化模型(为简洁起见,省略了 getter/setter):
class GeneralObject {
public String objType;
public String commonProp;
public GeneralObject nestedObject;
// map for additional properties, so that I can re-serialize the full object later
public Map<String, JsonNode> additionalFields = new HashMap<>();
@JsonAnyGetter
public Map<String, JsonNode> getAdditionalFields() {
return additionalFields;
}
@JsonAnySetter
public void addAdditionalField(String fieldName, JsonNode value) {
this.additionalFields.put(fieldName, value);
}
}
class SpecialObject extends GeneralObject {
public String specialProp;
}
实际上,有各种各样的“特殊对象”,我想成为 将来需要时可以添加更多。
json 看起来像这样(我从外部来源获取它们,我无法更改 发送格式):
{
"objType": "someType1",
"commonProp": "example1..."
}
{
"objType": "SPECIAL",
"commonProp": "example2...",
"specialProp": "more example"
}
{
"objType": "someOtherType",
"commonProp": "example3...",
"nestedObject": {
"objType": "SPECIAL",
"commonProp": "example2...",
"specialProp": "more example"
}
}
我目前正在像这样解析它们:
ObjectMapper mapper = new ObjectMapper();
String objString = "{\"objType\": \"SPECIAL\", \"commonProp\": \"...\", \"specialProp\": \"more example\"}";
GeneralObject genObj = mapper.readValue(objString, GeneralObject.class);
if (genObj.objType.equals("SPECIAL")) {
genObj = mapper.readValue(objString, SpecialObject.class);
}
// Some business-logic: If SPECIAL, then this cast is required to work:
System.out.println(((SpecialObject) genObj).specialProp);
这适用于顶级对象,但不适用于嵌套对象。如果,对于 例如,嵌套的 Object 是一个 SPECIAL 对象,它仍然会被反序列化为 一个共同的对象。
我想要做的是告诉Jackson:“无论嵌套级别如何,如果objType=SPECIAL,使用SpecialObject,否则使用GeneralObject”。我查看了Polymorphic Deserialization 并尝试使用@JsonSubTypes,但无法正确设置此逻辑。如何确保 SPECIAL 对象被反序列化为适当的类,即使它们是嵌套的?
【问题讨论】:
标签: java serialization jackson