[英]How to write custom JSON Deserializer for Jackson?
我需要将一些 JSON 反序列化为 Java class。 我有以下 JSON:
{
"list": [[{
"type": "text",
"subType": "ss"
},
{
"type": "image",
"subType": "text"
}
]]
}
我有以下 Java 类:
public abstract class BaseClass {
public String type;
public String subType;
}
public class Text extends BaseClass {
...
}
public class Image extends BaseClass {
}
我需要以这种方式反序列化,如果type
等于image
且子类型等于text
,我需要反序列化为Text
subType
,否则我需要反序列化为Image
class。
我该怎么做?
您不需要自定义反序列化器。 使用以下注释标记您的 BaseClass,并使用 ObjectMapper 进行反序列化:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", visible = true)
@JsonSubTypes({@JsonSubTypes.Type(value = Text.class, name = "text"), @JsonSubTypes.Type(value = Image.class, name = "image")
})
public abstract class BaseClass {
public String type;
public String subType;
}
JsonTypeInfo
定义使用type
字段的值作为类型名称。 JsonSubTypes
类型名称与 java 类相关联
您可以像这样实现自己的反序列化器:
public class BaseClassDeserializer extends StdDeserializer<BaseClass> {
public BaseClassDeserializer(Class<?> vc) {
super(vc);
}
@Override
public BaseClass deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
String type = node.get("type").asText();
String subType = node.get("subType").asText();
if("image".equals(type) && "text".equals(subType)){
/* create Text class
return new Text */
} else {
/* create Image class
return new Image(args...) */
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.