使用Jackson对JSON数组中存放不同对象反序列化

Posted 赵侠客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Jackson对JSON数组中存放不同对象反序列化相关的知识,希望对你有一定的参考价值。

最近项目中遇到一个JSON反序列化问题,看似很简单,但是又不常见,本来以为很容易解决,结果找了很多方法才解决了,基本过程大概是这样的。

JSON数组中存放不同对象序列化过程

基本代码

基本代码比较简单,首页一个枚举类型表示动物类型,然后一个动物父类有一个动物类型字段,有两个子类,一个是Cat,一个是Dog,Cat有自己的字段catType,Dog有自己的字段dogType,然后使用Jackson反序列化得到一个JONS数组。


public enum AnimalTypeEnum 
    DOG,
    CAT;


@Data
public class Animal 
    private AnimalTypeEnum type;

@Data
public class Cat extends Animal 
    private String catType;

@Data
public class Dog  extends Animal 
    private String dogType;

@Data
public class AnimalVo 
    private Integer size;
    private List<Animal> animals;


测试序列化代码

List<Animal>  animals=new ArrayList<>();
Cat cat=new Cat();
cat.setCatType("英短");
Dog dog=new Dog();
dog.setDogType("哈士奇");
animals.add(cat);
animals.add(dog);

AnimalVo animalVo=new AnimalVo();
animalVo.setSize(2);
animalVo.setAnimals(animals);

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(animalVo);
System.out.println(json);

序列化后的JSON


    "size": 2,
    "animals": [
        
            "type": "CAT",
            "catType": "英短"
        ,
        
            "type": "DOG",
            "dogType": "哈士奇"
        
    ]

反序列化过程

基本要求Controller层能直接通过 @RequestBody接口前端参数

反序列化基本要求也很简单,就是前端传一个JSON数据,后端使用 @RequestBody List<Animal> animals,能接收到就好了。

@PostMapping("/add")
public ResponseEntity<AnimalVo> add(@RequestBody AnimalVo animalVo) 
    log.info("", JsonUtils.toJson(animalVo));
    return ResponseEntity.ok(animalVo);

对Animal Cat Dog类进行代码改造

@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes(@JsonSubTypes.Type(value = Cat.class, name = "CAT"),
        @JsonSubTypes.Type(value = Dog.class, name = "DOG"))
public class Animal 
    @JsonIgnore
    private AnimalTypeEnum type;

   
@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "type")
public class Cat extends Animal 
    private String catType;


@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "type")
public class Dog  extends Animal 
    private String dogType;

测试过程

发送HTTP POST请求

POST http://127.0.0.1/add
Content-Type: application/json

"size":2,"animals":["type":"CAT","catType":"英短","type":"DOG","dogType":"哈士奇"]

Controller层可以正常接口

以上是关于使用Jackson对JSON数组中存放不同对象反序列化的主要内容,如果未能解决你的问题,请参考以下文章

使用Jackson对JSON数组中存放不同对象反序列化

如何在JAVA中用JACKSON映射一个JSON中的数组,这个数组可以包含不同类型的对象作为项目?

如何在JAVA中用JACKSON映射一个JSON中的数组,这个数组可以包含不同类型的对象作为项目?

Java Parse Json 与具有不同对象类型(Gson 或 Jackson 等)的数组

如何使用 Jackson 反序列化来自 json 对象的对象数组

JAVA:如何将 JSON 键值对映射到不同的变量 Jackson