FatJson增强序列化

2019/10/12

前言

上次说了fastjson的简单使用,但是在序列化过程中,我们无法保证我们即将要序列化的属性,但是有时候我们有些特殊的需求,例如如果一个属性是空,那这个属性要不要序列化进去,当然对于不同的业务有不同的需求。FJ提供方法来完成我们的不同需求

SerializerFeature枚举类

上次我们说了JSON.toJSONString(),里面放入obj,它就可以帮我们序列化成json串,但是里面还可以传入一个参数,是SerializerFeature的枚举。例如JSON.toJSONString(stuList, SerializerFeature.PrettyFormat);

image-20210410171221578

它的返回值

应该没人敢把这个串上生产吧….具体就是这么使用,下面列举一下SerializerFeature中用的比较多的成员

// 格式化后的串加入空格换行之类的变得好看(默认压缩节省空间)
JSON.toJSONString(stuList,SerializerFeature.PrettyFormat);

// 格式化后的串key和value使用单引号包裹(默认双引号)
// [{'gender':'男','name':'小明'},{'name':'小刚'}]
JSON.toJSONString(stuList, SerializerFeature.UseSingleQuotes);

// 如果字段为null,依然输出(默认不输出)
// [{"gender":"男","name":"小明"},{"gender":null,"name":"小刚"}]
JSON.toJSONString(stuList, SerializerFeature.WriteMapNullValue);

// 如果list为空, 则序列化成[]而不是null(默认是null)
JSON.toJSONString(stuList,SerializerFeature.WriteNullListAsEmpty);


// 字符类型字段如果为null,输出为”“,而非null
JSON.toJSONString(stuList, SerializerFeature.WriteNullStringAsEmpty);


// 数值字段如果为null,输出为0,而非null
JSON.toJSONString(stuList,SerializerFeature.WriteNullNumberAsZero);


// Boolean字段如果为null,输出为false,而非null
JSON.toJSONString(stuList,SerializerFeature.WriteNullBooleanAsFalse);


// 序列化时写入类型信息,默认没写入。写入后反序列化需要处理,并且额外占用空间
JSON.toJSONString(stuList, SerializerFeature.WriteClassName);


// 格式化后的串加入空格换行之类的变得好看
JSON.toJSONString(stuList, SerializerFeature.SkipTransientField);

实体类上做增强

用枚举方法来增强序列号一般使用map场景的用的多,什么时候使用map,就是不至于创建实体类的时候。当一个业务场景达到要创建实体类的程度了,频繁用这个枚举会很累的。FJ给我们提供了在实体类上一劳永逸做增强的方法。

@Data
@Builder
@JSONType()
private static class Student {
  private String name;
  private String gender;
}

这个@JSONType注解就可以让这一个类所有属性在序列化的时候做到增强,我也写出一些比较常用的值

@Data
@Builder
// 序列化的时候只包含这些字段
@JSONType(includes = {"name", "gender"})
private static class Student {
  private String name;
  private String gender;
}

@Data
@Builder
// 序列化的时候忽略这些值
@JSONType(ignores = {"name"})
private static class Student {
  private String name;
  private String gender;
}

@Data
@Builder
// 会按照输入的字段顺序序列化
@JSONType(orders = {"name", "gender"})
private static class Student {
  private String name;
  private String gender;
}

@Data
@Builder
// 序列化的时候选择序列化key的命名方式,默认CamelCase s
// CamelCase tudentName
// PascalCase student-name
// SnakeCase student_name
@JSONType(naming = PropertyNamingStrategy.CamelCase) 
private static class Student {
  private String name;
  private String gender;
}

实体类的属性上注解

上面都是控制一些比较宏观的,其实用的比较多的还是在属性字段上的注解-JSONField(),因为这个可以精确到每一个字段,更加可调控一些,并且其他方式能增强的属性注解也可以做到,我也给出一些比较常用的值

@Data
@Builder
private static class Student {
  // 序列化的时候的排序,数字越大排名越强,如果没设置这个值,则字段字母排序
  @JSONField(ordinal = 0)
  private String name;
  private String gender;
}

@Data
@Builder
private static class Student {
  private String name;
  // 指定序列化以后的名字
  @JSONField(name = "sex")
  private String gender;
}

@Data
@Builder
private static class Student {
  private String name;
  private String gender;
  // 配置序列化和反序列化时的日期格式
  @JSONField(format = "yyyMMdd")
  private Date createTime;
}

@Data
@Builder
private static class Student {
  // 设置序列化的时候是不是要序列化这个字段,默认是true
  @JSONField(serialize=false)
  private String name;
  // 设置反序列化的时候是不是要这个字段,默认是true
  @JSONField(deserialize=false)
  private String gender;
}

后言

以上就是FJ的一些序列化增强方法,用的比较多的还是实体类的属性注解,强烈建议大家看一下这个注解的源码,里面有哪些value,每个value的含义马上就能理解,用一下就熟练啦。

(转载本站文章请注明作者和出处 没有气的汽水



┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
├ 文章已经完啦, 想要第一时间收到文章更新可以关注↓ ┤
└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘

Post Directory






下面是评论区,欢迎大家留言探讨或者指出错误哈