一、前言——问题二、控制台输出格式化json三、解决问题:
1.`@JSonField(serialize = false)`2. @JSonField(format = "")处理日期3. 全局控制:SerializerFeature
(1)全局日期格式化(2)SerializerFeature.IgnoreNonFieldGetter(3)为null的属性默认自动排除(4)空字符串不序列化 4. 自定义序列化 四、依赖五、特殊SerializerFeature 属性说明六、了解 Fastjson 定制序列化
1.通过 @JSonField 定制序列化2.通过 @JSonType 定制序列化3.通过 ParseProcess 定制反序列化4.通过 SerializeFilter 定制序列化
一、前言——问题当使用 com.alibaba.fastjson.JSONObject.toJSonString(Object) 将JavaBean实体转换为json的时候,怎么忽略掉某些属性不参与序列化等。
常见场景:
a. 值为空或值为空字符串的属性不参加序列化
b. 某实体在转json时不参加序列化
c. 日期格式化
d. 实体内非属性字段,但是以is开头的方法(isXXX/is_XXX),别的方法未发现,此问题可看下图:
二、控制台输出格式化json
首先我们先将我们输出的json格式化,待会儿看着方便格式化json:用 SerializerFeature.PrettyFormat
return JSONObject.toJSONString(petShop,SerializerFeature.PrettyFormat);
可以看到JSONObject将实体转json时:
(1)实体转json时,值为null的属性默认已排除;
(2)值为空字符串的属性没有排除;
(3)实体里is开头的方法(isXXX/is_XXX)会被当作属性转换到json里
三、解决问题:
1.@JSonField(serialize = false)
实体的属性或方式上加注解@JSonField(serialize = false)排除 isXXX/is_XXX 方法或某个指定属性注意:别用错了 @JsonIgnore也行,但是不是alibaba包下的,所以用了也不生效
2. @JSonField(format = “”)处理日期
单个属性的日期格式化
@JSONField(format = "yyyy-MM-dd") @JSONField(format = "yyyy-MM-dd HH:mm:ss")
同样的,这个格式化的时候,也注意别用错了,也可以用下面的,但是不alibaba包下的,一样不生效
@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”)没有格式化的:
格式化后的:
3. 全局控制:SerializerFeature
(1)全局日期格式化
SerializerFeature.WriteDateUseDateFormat (2)SerializerFeature.IgnoreNonFieldGetter
我们刚加的单个注解都去掉,然后用SerializerFeature测试。
忽略isXXX/is_XXX 方法或者更多其他
直接用:SerializerFeature.IgnoreNonFieldGetter
在fastjson中,缺省是不输出空值的。无论Map中的null和对象属性中的null,序列化的时候都会被忽略不输出,这样会减少产生文本的大小。但是有时候接口联调需要,非要输出的话,用:SerializerFeature.WriteMapNullValue
(4)空字符串不序列化
我们还有个问题没有解决,就是空字符串如果也不想序列化怎么处理呢?看源码可以看出 SerializerFeature的属性有处理空置的几个属性,但是没有处理空字符串的呀?
别急,且往下看【4. 自定义序列化】!
4. 自定义序列化
居然 SerializerFeature 里没有对空字符串的处理,那我们就自己定义,思路:
用 SerializeFilter 定制扩展序列化,我们使用修改属性的值 ValueFilter (将空字符串的值,修改为null),而 SerializerFeature 对null 有默认排除,二者结合,搞定!如下:
搞定,空字符串问题解决!核心代码如下:
JSONObject.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";//自定义格式
SerializerFeature[] serializerFeatures = new SerializerFeature[]{
SerializerFeature.PrettyFormat,
SerializerFeature.IgnoreNonFieldGetter,
//SerializerFeature.WriteDateUseDateFormat,//默认 yyyy-MM-dd HH:mm:ss 的格式
};
// return JSONObject.toJSonString(petShop,serializerFeatures);
return JSONObject.toJSONString(petShop,filter,serializerFeatures);
}
private static ValueFilter filter = new ValueFilter () {
public Object process(Object obj, String key, Object value) {
if(value==null){
//return "is null ???? I want to change the value!!!";
}else if("".equals(value.toString())){
return null;
}
return value;
}
};
代码可优化,想配置管理自己弄就行!
四、依赖五、特殊SerializerFeature 属性说明com.alibaba fastjson 1.2.76
(1)WriteDateUseDateFormat:默认 yyyy-MM-dd HH:mm:ss 的格式
可自定义格式:JSONObject.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
(2)UseSingleQuotes 使用单引号而不是双引号,默认为false(3)WriteClassName 序列化时写入类的信息,默认为false。反序列化是需用到
六、了解 Fastjson 定制序列化
fastjson支持多种方式定制序列化。 1.通过 @JSonField 定制序列化 2.通过 @JSonType 定制序列化 3.通过 ParseProcess 定制反序列化 4.通过 SerializeFilter 定制序列化
SerializeFilter 是通过编程扩展的方式定制序列化。fastjson支持多种SerializeFilter,用于不同场景的定制序列化,简单写出两三个:
(1)ValueFilter 修改 Value
(2)PropertyPreFilter 根据 PropertyName 判断是否序列化
(3)PropertyFilter 根据 PropertyName和PropertyValue 来判断是否序列化
OK,到此结束,想了解更多,自己看源码去。



