我需要将一些JSON反序列化为Java类。我有以下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
并且subType
等于text
我需要反序列化为Text
类,否则我需要反序列化到Image
类。
我该怎么办?
答案 0 :(得分:1)
您不需要自定义解串器。用以下注释标记您的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类相关联
答案 1 :(得分:0)
您可以像这样实现自己的解串器:
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...) */
}
}
}