当前位置:   article > 正文

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

serializerfeature.ignorenonfieldgetter

一、前言——问题

当使用 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);
  • 1

在这里插入图片描述

  • 可以看到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")
  • 1
  • 2
  • 同样的,这个格式化的时候,也注意别用错了,也可以用下面的,但是不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;
        }
    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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

四、依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

五、特殊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,到此结束,想了解更多,自己看源码去。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/923010
推荐阅读
相关标签
  

闽ICP备14008679号