[英]How to write custom JSON Deserializer for Jackson?
I need to deserialize some JSON to Java class.我需要将一些 JSON 反序列化为 Java class。 I have the following JSON:
我有以下 JSON:
{
"list": [[{
"type": "text",
"subType": "ss"
},
{
"type": "image",
"subType": "text"
}
]]
}
and I have the following Java classes:我有以下 Java 类:
public abstract class BaseClass {
public String type;
public String subType;
}
public class Text extends BaseClass {
...
}
public class Image extends BaseClass {
}
and I need deserialize in this way, if type
equals image
and subType
equals text
I need to deserialize into Text
class otherwise I need deserialize to Image
class.我需要以这种方式反序列化,如果
type
等于image
且子类型等于text
,我需要反序列化为Text
subType
,否则我需要反序列化为Image
class。
How can I do it?我该怎么做?
You don't need a custom deserializer.您不需要自定义反序列化器。 Mark your BaseClass with the following annotations, and deserialize with an ObjectMapper:
使用以下注释标记您的 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
defines to use value of type
field for type name. JsonTypeInfo
定义使用type
字段的值作为类型名称。 JsonSubTypes
associates type names with java classes JsonSubTypes
类型名称与 java 类相关联
You can implement your own deserializer like so:您可以像这样实现自己的反序列化器:
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.