常见:使用fastjson进行需要对字段进行一些特殊处理,比如时间格式,前后端名字不一致,字段为null是否依然序列化等问题。那么fastjson的@JSONField就能很好的解决这些问题。

@JSONField注解的源码如下

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface JSONField {int ordinal() default 0; //是根据fieldName的字母序进行序列的,你可以通过ordinal指定字段的顺序String name() default ""; //序列化和反序列化时候的别名String format() default ""; //用于字符串格式的日期转换boolean serialize() default true; // 是否参与序列化boolean deserialize() default true; //是否参与反序列化SerializerFeature[] serialzeFeatures() default {}; //序列化选项 SerializerFeature.WriteNullNumberAsZero 如空Number填充0Feature[] parseFeatures() default {}; //反序列化选项String label() default ""; //标签,boolean jsonDirect() default false; //当你有⼀个字段是json字符串的数据,你希望直接输出,⽽不是经过转义之后再输出。Class<?> serializeUsing() default Void.class; // 属性的序列化类,可定制。可有现存的,比如本来是Long,序列化的时候转为String:serializeUsing= ToStringSerializer.classClass<?> deserializeUsing() default Void.class; // 属性的反序列化类,可定制。String[] alternateNames() default {}; //参与反序列化时候的别名boolean unwrapped() default false; // 对象映射到父对象上。不进行子对象映射。简单而言,就是属性为对象的时候,属性对象里面的属性直接输出当做父对象的属性输出String defaultValue() default ""; //设置默认值
}

现在开始分别开始讲解如何使用:
1、ordinal 、name 、serialize、 deserialize、 format、defaultValue

public class JSONController {public static void main(String[] args) {Nation nationBean1 = Nation.builder().dress("现代服饰").num(1314).build();String str = JSON.toJSONString(nationBean1);System.out.println(str);                            //{"name":"汉族","number":1314}Nation nation = JSON.parseObject(str, Nation.class);System.out.println(JSON.toJSONString(nation));      //{"name":"汉族"}}
}@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
class Nation {@JSONField(defaultValue = "汉族")private String name;@JSONField(ordinal = 1, name = "DRESS", serialize = false)private String dress;@JSONField(ordinal = 2, name = "number", deserialize = false)private Integer num;@JSONField(ordinal = 3, format = "yyyy-MM-dd")private Date celebrateHoliday;
}

2、serialzeFeatures、parseFeatures
他们是序列化、反序列化时候的一些可选的特征:

序列化的时候
比如fastjson默认是不会将为null的属性输出的,若是我们也想输出,可以加入@JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue)
还有就是,数值型为null的话,就输出0,可以使用@JSONField(serialzeFeatures = SerializerFeature.WriteNullNumberAsZero)

反序列化的时候,
比如parser是否将允许使用非双引号属性名字。@JSONField(parseFeatures = Feature.AllowSingleQuotes)

public class JSONController {public static void main(String[] args) {Nation nationBean1 = Nation.builder().name("汉族").build();String str = JSON.toJSONString(nationBean1);System.out.println(str);//{"celebrateHoliday":null,"name":"汉族","num":0}}
}@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
class Nation {private String name;private String dress;@JSONField(serialzeFeatures = SerializerFeature.WriteNullNumberAsZero)private Integer num;@JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue)private Date celebrateHoliday;
}

具体有:
名称 含义

QuoteFieldNames 输出key时是否使用双引号,默认为true
UseSingleQuotes 使用单引号而不是双引号,默认为false
WriteMapNullValue 是否输出值为null的字段,默认为false
WriteEnumUsingToString Enum输出name()或者original,默认为false
UseISO8601DateFormat Date使用ISO8601格式输出,默认为false
WriteNullListAsEmpty List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty 字符类型字段如果为null,输出为”“,而非null
WriteNullNumberAsZero 数值字段如果为null,输出为0,而非null
WriteNullBooleanAsFalse Boolean字段如果为null,输出为false,而非null
SkipTransientField 如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true
SortField 按字段名称排序后输出。默认为false
WriteTabAsSpecial 把\t做转义输出,默认为false不推荐设为true
PrettyFormat 结果是否格式化,默认为false
WriteClassName 序列化时写入类型信息,默认为false。反序列化是需用到
DisableCircularReferenceDetect 消除对同一对象循环引用的问题,默认为false
WriteSlashAsSpecial 对斜杠’/’进行转义
BrowserCompatible 将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false
WriteDateUseDateFormat 全局修改日期格式,默认为false。
DisableCheckSpecialChar 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false
BeanToArray 将对象转为array输出

3、label
可以给属性设置标签,这样可以批量处理某一类的属性,比如不序列化某一类属性。

public class JSONController {public static void main(String[] args) {Nation nationBean1 = Nation.builder().name("汉族").dress("便服").num(12).celebrateHoliday(new Date()).build();String str = JSON.toJSONString(nationBean1, Labels.includes("a"));System.out.println(str); //{"num":12}String str2 = JSON.toJSONString(nationBean1, Labels.excludes("a"));System.out.println(str2); //{"celebrateHoliday":1598929877786,"dress":"便服","name":"汉族"}}
}@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
class Nation {private String name;private String dress;@JSONField(label = "a")private Integer num;@JSONField(label = "b")private Date celebrateHoliday;
}

4、jsonDirect
它的作用是:当你有⼀个字段是json字符串的数据,你希望直接输出,而不是经过转义之后再输出。

public class JSONController {public static void main(String[] args) {Nation nationBean1 = Nation.builder().name("{}").dress("{}").build();String str = JSON.toJSONString(nationBean1);System.out.println(str); //{"dress":"{}","name":{}}}
}@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
class Nation {@JSONField(jsonDirect = true)private String name;@JSONField(jsonDirect = false)private String dress;private Integer num;private Date celebrateHoliday;
}

5、serializeUsing和deserializeUsing
可定制的序列化和反序列化的类,但是也有原生的。
比如原生:比如字段本来是Long,序列化的时候转为String。
比如自定义:我对某个字段加上我想要的处理结果“中国的”

public class JSONController {public static void main(String[] args) {Nation nationBean1 = Nation.builder().name("汉族").num(2323).build();String str = JSON.toJSONString(nationBean1);System.out.println(str);//{"name":"中国的汉族","num":"2323"}}public static class MySerializer implements ObjectSerializer {@Overridepublic void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {String text = "中国的" + (String) object;serializer.write(text);}}
}@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
class Nation {@JSONField(serializeUsing = JSONController.MySerializer.class)private String name;private String dress;@JSONField(serializeUsing = ToStringSerializer.class)private Integer num;private Date celebrateHoliday;
}

6、alternateNames
反序列化时候的别名

public class JSONController {public static void main(String[] args) {String str ="{\"Name\":\"汉族\",\"num\":2323}";System.out.println(JSON.toJSONString(JSON.parseObject(str, Nation.class)));//{"name":"汉族","num":2323}}}@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
class Nation {@JSONField(alternateNames = {"name", "Name"})private String name;private String dress;private Integer num;private Date celebrateHoliday;
}

7、unwrapped
对象映射到父对象上。不进行子对象映射。简单而言,就是属性为对象的时候,属性对象里面的属性直接输出当做父对象的属性输出

public class JSONController {public static void main(String[] args) {QSM qsm = new QSM();qsm.setName("传闻中的陈芊芊");qsm.setCity("花垣城");QSM qsm2 = new QSM();qsm2.setName("传闻中的韩烁");qsm2.setCity("玄虎城");Nation nation1 = Nation.builder().name("中国").qsm(qsm).qsm2(qsm2).build();System.out.println(JSON.toJSONString(nation1));//{"name":"中国","city":"花垣城","name":"传闻中的陈芊芊","qsm2":{"city":"玄虎城","name":"传闻中的韩烁"}}}}@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
class Nation {private String name;@JSONField(unwrapped = true)private QSM qsm;@JSONField(unwrapped = false)private QSM qsm2;
}@Data
class QSM {String name;String city;
}

【完】

正在去BAT的路上修行

FastJson小技巧——@JSONField的史上最全最详细讲解——一看就会相关推荐

  1. 史上最全最详细多种手机主流操作系统详解

    史上最全最详细多种主流操作系统详解(经典,值得收藏) 2017-06-09 18:07 操作系统 一.手机操作系统 1 Android 谷歌安卓 这里写图片描述(https://img-blog.cs ...

  2. 世界各地 史上最全最详细无线通信频率分配表(内容含概wifi、2.4G、5G,绝对值得收藏)

    1.目前主流的无线WIFI网络设备802.11a/b/g/n/ac: 传统 802.11 1997年发布 两个原始数据率:1Mbps 和 2Mbps 跳频展频 (FHSS)或直接序列展布频谱(DSSS ...

  3. [不看后悔啊!]史上最为全面的Autocad施工图视频教程 看完就能成为装修设计师 http://www.51zxw.net/study.asp?vip=1573837

    [不看后悔啊!]史上最为全面的Autocad施工图视频教程 看完就能成为装修设计师 http://www.51zxw.net/study.asp?vip=1573837 沈阳设计:http://hom ...

  4. android 获取wifi主频,史上最全最详细无线通信频率分配表(绝对收藏)

    原标题:史上最全最详细无线通信频率分配表(绝对收藏) 1.5G NR (标准未完成,建议关注) 2.LTE/LTE-Advanced/LTE-Advanced Pro 3. WCDMA/HSPA/HS ...

  5. 史上最全电子元器件知识讲解

    史上最全电子元器件知识讲解 2016-05-10 半导体行业观察 芯榜(IC行业排行榜) 芯榜 - IC服务平台,用数据读懂芯片业. 转载于:https://www.cnblogs.com/sunny ...

  6. Linux操作系统——Xshell和Xftp 下载、安装、使用教程(史上最全最详细)

    Linux操作系统--Xshell和Xftp 下载.安装.使用教程(史上最全最详细) 本文将带你手把手的下载.安装并使用Xshell和Xftp软件 文章目录 Linux操作系统--Xshell和Xft ...

  7. FastJson小技巧——@JSONField

    常见:使用fastjson进行需要对字段进行一些特殊处理,比如时间格式,前后端名字不一致,字段为null是否依然序列化等问题.那么fastjson的@JSONField就能很好的解决这些问题. @JS ...

  8. 史上最全换档讲解手动档汽车的换挡技巧

    转个东东给大家看看,关于换档的. 在网上已有很多讨论,涉及到的方面也林林总总.归纳一下的话,我觉得不外乎可以分为两 大类,一是换挡时机,即何时加档何时减档:二是换挡本身的操作,包括换挡时油门离合器的配 ...

  9. 如何快速上手小程序开发(史上最全)

    01 开发前准备 登录微信小程序官网:mp.wx.qq.com(这里以微信小程序为例) 申请属于你个人的小程序账号(分为个人和企业,在这申请个人很容易) 按照文档,下载微信开发者工具,进行登录,创建一 ...

最新文章

  1. Mybatis入门及于hibernate的区别
  2. 基于ZooKeeper实现HA高可用性以及自动主备切换
  3. 卸载 windows_Windows 10可能很快会自动卸载有问题的Windows更新
  4. 如何进入HPunix的单用户模式
  5. python发送文件_python:socket传输大文件
  6. 离开页面前onbeforeunload事件在火狐的兼容并且提交不触发
  7. Python语法基础——关于全局变量与局部变量
  8. 断线的风筝,该飘向哪里
  9. python 知乎美女_听说知乎大神用python爬取高颜值美女,是怎么操作的?
  10. 极速PDF打开文件后工具栏不显示怎么办
  11. 百度排名批量查询_白杨SEO:一文告诉你SEO站长综合查询工具5118功能使用大全!...
  12. windows server 2016添加开机启动项
  13. 最新100个微信小程序
  14. Missing parentheses in call to 'print'——python语法错误
  15. PYNQ2裸跑之音频ADAU1761
  16. 红米5无法连接到计算机,红米手机连不上电脑如何解决_红米手机连接电脑的操作步骤...
  17. java中集合的分类以及集合的选择
  18. NLTK-007:分类文本(文档情感分类)
  19. SqlServer geometry 转 geography
  20. linux tar的排除,Tar命令排除指定目录(常用Linux命令整理)

热门文章

  1. 虚拟服务器关机之后怎么开,云服务器关机了怎么开启
  2. WVP+ZLMediaKit实现NAT穿透推流播放录制,支持IPC、NVR、DVR等设备接入,支持GB28181国标级联
  3. css 分栏布局 columns
  4. 2022年最新青海机动车签字授权人模拟考试及答案
  5. virsh链接虚拟机_virsh创建虚拟机
  6. IBM AppScan 安全扫描:Missing Content-Security-Policy ;X-Content-Type-Options ;X-XSS-Protection响应头
  7. Beginning Zeros
  8. 按图片搜索(item_search_img)API
  9. windows系统启动java程序限制cpu核心数
  10. 【汇正财经】白马股的特征