栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

简单说com.alibaba.fastjson 的 SerializerFeature + 自定义序列化

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

简单说com.alibaba.fastjson 的 SerializerFeature + 自定义序列化

简单说 Fastjson 定制序列化 + 自定义序列化

一、前言——问题二、控制台输出格式化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

(3)为null的属性默认自动排除

在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;
        }
    };

代码可优化,想配置管理自己弄就行!

四、依赖

            com.alibaba
            fastjson
            1.2.76
        
五、特殊SerializerFeature 属性说明

(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,到此结束,想了解更多,自己看源码去。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/711406.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号