Fastjson与Jackson序列化反序列化差异对比

Fastjson与Jackson序列化反序列化差异对比

  1. 对基本数据类型boolean的处理

当boolean类型字段以is开头,Fastjson与Jackson序列化结果一样,is被去掉。当使用的Jackson和Fastjson的字段转换注解(@JsonProperty(“isXXX”),@JSONFied(name=“isXXX”))时,Fastjson序列化后字段名为isXXX,Jackson序列化后生成两个字段isXXX和XXX。如果将字段isXXX映射为XXX(即使用注解@JsonProperty(“XXX”)或@JSONField(name=“XXX”)时),Fastjson和Jackson序列化后结果一样。

2. 对Java.sql.Date的特殊处理

Fastjson版本1.2.57~1.2.61版本对java.sql.Date类型字段特殊处理,序列化后为yyyy-MM-dd格式,其余版本与Jackson处理结果一致。

3. 找不到属性setter方法的处理

反序列时,默认情况下,如果根据json字符串的属性,在实体类中找不到对应的setter方法,Fastjson会忽略该属性,Jackson会报错,(Jackson通过配置DeserializationFeature.Fail_ON_UNKNOW_PROPERTIES为false忽略找不到setter方法的属性)。
在反序列化时,若找不到属性的setter方法,Jackson会进一步找同名字段,Fastjson会直接忽略。

4. 对字段名没有被引号包括起来的处理

对于Json字符串中字段名没有被引号包括起来Fastjson默认是支持的,Jackson默认不支持,需通过配置JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES为true开启。

5. 序列化时值为null

Fastjson在序列化时如果值为null,默认序列化后属性被忽略,需要配置SeralizerFeature.WriteMapNullValue开启;
Jackson在序列化时如果值为null,默认配置序列化后属性保留,值为null。

6. 对被transient修饰的属性的序列化

Fastjson序列化时默认忽略被transient修饰的属性;
Jackson序列化时被transeint修饰的属性默认序列化,如果不序列化需要配置MapperFeature.PROPAGATE_TRANSIENT_MARKER为true.

7. Fastjson的 AutoType特性

当一个类中包含了接口(或抽象类)的时候,在使用Fastjson进行序列化的时候,会把子类型抹去,只保留接口(抽象类)的类型,使得反序列化时无法拿到原始类型。Fastjson引入AutoType,在序列化的售后把原始类型记录下来,以便于在反序列化的时候找到对应的类型。Fastjson在版本1.2.25之后AutoType默认关闭,如果使用了Fastjson的AutoType特性在替换为Jackson时可以在属性上使用@JsonTypeInfo,次注解用于序列化有关多态实例的实际信息,以便于Jackson可以知道要反序列的子类型

你可能感兴趣的:(Java,java,json)