反序列化问题

  • 反序列化不存在的properties时,报错,须要注解 @JsonIgnoreProperties
  • 反序列化未知的enum时,报错

如果不心愿报错,那么须要批改Jackson 配置。

Jackson 配置

办法一:批改 objectMapper 的 configuration

public class JsonUtil {    private static ObjectMapper mapper;    static {        mapper = new ObjectMapper();        // ...        // ignore unknown properties        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);        // unknown enum -> null        mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);        // include none null        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);    }}

办法二:批改application.yaml配置

spring:  # Jackson 配置  jackson:    # Include NON_NULL    default-property-inclusion: non_null    # 反序列化    deserialization:      # ignore unknown property      fail-on-unknown-properties: false      # unknown enum -> null      read-unknown-enum-values-as-null: true

Have a test!

example enum:

public enum RateSpan {    W01("近一周"),    M01("近一个月"), M03("近三个月"), M06("近六个月"),    Y01("近一年"), Y03("近三年"), Y00("今年以来"), YGB("成立以来");    final String msg;    RateSpan(String msg) {        this.msg = msg;    }    public String getMsg() {        return msg;    }}
class RateSpanTest {    @Test void deserialize() throws JsonProcessingException {        // "Y01" -> Y01        RateSpan span = JsonUtil.loadStr("\"Y01\"", RateSpan.class);        assertEquals(span, RateSpan.Y01);        // "FUCK" -> null        span = JsonUtil.loadStr("\"FUCK\"", RateSpan.class);        assertNull(span);    }}

More

除了反序列化为 null,咱们还能够将 unknown enum 反序列化为一个默认值

只须要批改配置:

public class JsonUtil {    private static ObjectMapper mapper;    static {        mapper = new ObjectMapper();        // ...        // unknown enum -> default        mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, true);    }}  

而后加上@JsonEnumDefaultValue 注解,

public enum RateSpan {    // ...    // 加上default注解    @JsonEnumDefaultValue    Y01("近一年"), Y03("近三年"),    // ...}

单元测试。FUCK反序列化为 默认的 Y01:

class RateSpanTest {    @Test void deserialize() throws JsonProcessingException {        RateSpan span = JsonUtil.loadStr("\"Y01\"", RateSpan.class);        assertEquals(span, RateSpan.Y01);                // "FUCK" -> Y01        span = JsonUtil.loadStr("\"FUCK\"", RateSpan.class);        assertEquals(span, RateSpan.Y01);    }}