记一次使用Jackson对Java对象序列化和反序列化的踩坑经历

背景大概是这样,项目中的两个服务A和B依赖了同一个common包的Java类,A对该类json序列化,而B对其反序列化。在一次common包升级过程中,这个Java类中增加了一个属性,由于B其实用不到这个属性,就只把A给升级打包了,这就导致B在反序列化时出现了一个异常:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field 。

使用代码简单示例一下:

package com.suspect.json.model;


import lombok.*;

@ToString
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    String name;
    Integer age;
    String gender;

}
package com.suspect.json;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.suspect.json.model.Student;
import java.io.IOException;

public class Application {
    public static void main(String[] args) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        String srcJsonString = "{\"number\":\"110119120\",\"name\":\"林志玲\",\"age\":18,\"gender\":\"女\"}";
        Student to = objectMapper.readValue(srcJsonString, Student.class);
        System.out.println(to);

    }
}

可以看出,json串中比Java对象多了一个属性,这就会导致上述异常。解决方法也很简单,就是在需要json序列化和反序列化的Java类上增加一个JsonIgnoreProperties注解即可:

package com.suspect.json.model;


import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.*;

@ToString
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Student {
    String name;
    Integer age;
    String gender;

}

如此,就会在反序列化时忽略未知的属性,不再出现异常。不过,虽然这种方法可行,但是需要在每个序列化的Java类上都增加JsonIgnoreProperties,万一有时候忘记加了就麻烦了(这个是很可能会出现的),所以比较好的方法是在jackson包上增加一层封装,然后对jackson进行统一的配置,针对上述情况的配置就是去使能DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,当然项目中还可以增加其他一些特殊的性质。封装后就约定都使用封装来调用jackson,这样就会更加统一一些。

 

你可能感兴趣的:(json)