背景
遇到一个奇葩的需求,给一段json数据,json数据中存在一个数组,数组中有两个字段不一样的对象,需要根据name对应的值将其反序列化成不同的实体类
json示例:
#根据女朋友name值去生成不同的对象
{
"name":"zyy",
"age":"18",
"girlfriend":[
{
"id":"1",
"name":"女1",
"height":"170m"
},
{
"id":"2",
"name":"女2",
"weight":"110kg"
}
]
}
实现
FastJson多态反序列化支持并不是很好,因此使用Jackson去实现此需求,在对应的女朋友的父类加上注解,其中:
use–表示在序列化时标志出不同的类型用什么区分
property–表示使用什么字段去区分,本示例采用name字段去区分生成不同的对象
visible–表示用字段区分生成不同的对象时,是否序列化该区分字段,例如本例中用name区分,true则生成对象中的Girlfriend1中的name值等于"女1",false则name值等于null
@Data
public class ZyyTest{
private String name;
private Integer age;
private List<Girlfriend> girlfriends;
}
@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "name", visible = true)
@JsonSubTypes(value = {@JsonSubTypes.Type(value = Girlfriend1.class, name = "女1"),@JsonSubTypes.Type(value = Girlfriend2.class, name = "女2")})
public class Girlfriend {
private String name;
private Integer id;
}
@Data
public class Girlfriend1 extends Girlfriend{
private String height;
}
@Data
public class Girlfriend2 extends Girlfriend{
private String weight;
}
测试
public class Test {
public static void main(String[] args) throws JsonProcessingException {
String json = "{\n" +
" \"name\":\"zyy\",\n" +
" \"age\":\"18\",\n" +
" \"girlfriend\":[\n" +
" {\n" +
" \"id\":\"1\",\n" +
" \"name\":\"女1\",\n" +
" \"height\":\"170m\"\n" +
" },\n" +
" {\n" +
" \"id\":\"2\",\n" +
" \"name\":\"女2\",\n" +
" \"weight\":\"110kg\"\n" +
" }\n" +
" ]\n" +
"}";
ObjectMapper objectMapper = new ObjectMapper();
ZyyTest zyyTest = objectMapper.readValue(json, ZyyTest.class);
System.out.println(zyyTest);
}
}

这样就可以依据name生成不同的对象了
这篇博客介绍了如何利用Jackson库处理JSON数据中包含不同类型的数组元素,通过在父类添加注解实现多态反序列化。示例展示了如何根据女朋友name字段生成不同的实体类对象,并提供了测试代码验证其功能。
646

被折叠的 条评论
为什么被折叠?



