当前位置: 首页 > 后端技术 > Java

Jackson反序列化问题及配置

时间:2023-04-01 15:26:33 Java

反序列化问题反序列化不存在的属性时报错,需要注解@JsonIgnoreProperties。反序列化未知枚举时,会报错。如果不想报错,需要修改Jackson配置。Jackson配置方式一:修改objectMapper的配置publicclassJsonUtil{privatestaticObjectMappermapper;static{映射器=newObjectMapper();//...//忽略未知属性mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);//未知枚举->nullmapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL,true);//不包括nullmapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);}}方法二:修改application.yaml配置spring:#Jacksonconfigurejackson:#IncludeNON_NULLdefault-property-inclusion:non_null#反序列化deserialization:#忽略未知属性fail-on-unknown-properties:false#unknownenum->nullread-unknown-enum-values-as-null:trueHaveatest!exampleenum:publicenumRateSpan{W01("近一周"),M01("近一个月"),M03("近三个月"),M06("将近六个月"),Y01("近一年"),Y03("近三年"),Y00("今年以来"),YGB("成立以来");finalStringmsg;RateSpan(Stringmsg){this.msg=msg;}publicStringgetMsg(){returnmsg;}}classRateSpanTest{@Testvoiddeserialize()throwsJsonProcessingException{//"Y01"->Y01RateSpanspan=JsonUtil.loadStr("\"Y01\"",RateSpan.class);assertEquals(span,RateSpan.Y01);//"FUCK"->nullspan=JsonUtil.loadStr("\"FUCK\"",RateSpan.class);assertNull(span);}}除了反序列化为null,我们还可以将未知枚举反序列化为默认值只需修改配置:publicclassJsonUtil{privatestaticObjectMappermapper;static{映射器=newObjectMapper();//...//未知枚举->默认mapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE,true);然后在@JsonEnumDefaultValue注解上添加,publicenumRateSpan{//...//添加默认注解@JsonEnumDefaultValueY01("近一年"),Y03("近三年"),//...}单元测试。FUCK反序列化为默认Y01:assertEquals(span,RateSpan.Y01);//"FUCK"->Y01span=JsonUtil.loadStr("\"FUCK\"",RateSpan.class);assertEquals(span,RateSpan.Y01);}}