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

2023-05-16

常见:使用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填充0

        Feature[] parseFeatures() default {}; //反序列化选项

        String label() default ""; //标签,

        boolean jsonDirect() default false; //当你有⼀个字段是json字符串的数据,你希望直接输出,⽽不是经过转义之后再输出。

        Class<?> serializeUsing() default Void.class; // 属性的序列化类,可定制。可有现存的,比如本来是Long,序列化的时候转为String:serializeUsing= ToStringSerializer.class

    	Class<?> 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 {
        @Override
        public 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的路上修行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 使用Xshell连接Ubuntu主机失败

    1 问题 在将一台Ubuntu系统的电脑作为服务器 xff0c 使用Xshell连接时 xff0c 发生如下错误 此时使用ping工具检查是否能够ping通 说明能够连接上 xff0c 但是不能使用Xshell进行远程操作 2 解决方法 首
  • P900数传参数配置

    端口定义 xff1a xff08 从左往右 xff09 GND RX TX 5V 调试软件 xff1a X CTU 启动调试 xff1a 按住数传板上SW2 xff0c 同时按住SW1 xff0c 然后松开SW2 xff0c 再松开SW1
  • 利用ROS实现PX4 offboard板外控制

    基于ROS Melodic xff0c 以px4开发者手册实例程序为例 xff0c 实现gazebo下无人机起飞两米悬停 xff0c 具体操作分为三步 xff1a 1 创建工作空间 xff0c 建立offboard包 2 构建mavros
  • Jetson TX2开发板配置Intel T265环境的必要解决方式

    在Jetson TX2配置T265相关依赖时会发生错误 xff0c 因此需要提前对相关参数进行设置 xff0c 主要要将网络设置里面的相关参数改成下图的配置 xff1a
  • pixhawk日志ulg格式转matlab数据csv格式

    1 windows下打开Anconda Prompt xff0c 执行pip install pyulog安装pyulog包 2 在日志文件所在文件夹下执行ulog2csv 文件名 ulg即可生成相关的csv文件
  • 悲催的秋招之路

    个人情况 双非工科硕 民办本 专科起点 基础不行 专业知识不扎实 无技术无论文无项目 投递记录 企业名称 投递时间 岗位1 岗位2 岗位3 岗位4 国电南自 2021 5 19 嵌入式软件研发工程师 民生银行 2021 5 26 金融科技方
  • Matlab读取EXCEL文本中的数据并绘制二维三维曲线图脚本

    Matlab读取EXCEL文本中的数据并绘制二维三维曲线图需要将EXCEL保存为CSV格式 xff0c 然后取数据成矩阵进行处理 转CSV的方式 xff1a pixhawk日志ulg格式转matlab数据csv格式 1 导入文件 span
  • 零基础教会你用github创建个人博客网站

    1 创建账号 进入github网站 xff0c 在网站首页右上角进行用户注册 2 填写相关信息 按照提示填写相关信息完成用户注册 3 搭建个人博客库 进入个人主页 xff0c 在右上角选择 43 好 xff0c 进入 new reposit
  • SV2-4G移动终端使用配置与使用

    一 硬件连接 1接位置天线 xff0c 2接方向天线 xff0c 3接4G天线 xff0c 4接GPS配置专用线 xff0c 5接4G配置专用线 二 运行状态识别 1处为指示灯 xff08 运行 SIM卡 网络 电源 xff09 xff0c
  • yapi插件开发及安装的一些备注

    yapi官方文档有些缺失 xff0c 这里做一下补充 xff0c 官方文档地址 xff1a https hellosean1025 github io yapi documents redev html 插件开发需要调试 xff0c 这个需
  • VSCode修改编辑器(代码窗口)背景色

    VSCode 的背景色是放在主题里面定义的 xff0c 所以在vscode的设置中无法修改到编辑器也就是代码窗口的背景色 xff0c 对应想要自定义编辑器背景的同志们来说 xff0c 可以通过修改主题文件来实现 xff0c 操作起来也并不复
  • ros下tcp通信的过程

    ros框架下的tcp通信的过程 博主在编写一个需要通过wifi传输两个整数和一个状态的问题中 xff0c 通过构建ros xff08 Ubuntu16 04 框架下的tcp c 43 43 通信过程解决了问题 一 ros串口通信的实现 首先
  • Ecos操作系統查看进程信息

    由于最近公司用到了ecos操作系统 xff0c 所以简单的了解了一下这个RTOS xff0c 其相关的社区资源较少 xff0c 国内基本不用 xff0c 这里结合手册整理了一部分的内容 本文章主要两部分 xff0c 一是建立基本的测试进程
  • 在vmware上运行ecos

    目前关于在vmware虚拟机上运行ecos的文章应该是有 xff0c 我会放到文章最后面的资源链接 xff0c 所以写这篇文章的目的有两点 xff0c 一是补充原有文章的不足 xff0c 在实际操作中遇到的困难 二是提供其中相关的资源链接
  • PROFINET协议解析-DCP

    目录 一 设置 Set xff08 请求 xff09 二 设置Set xff08 应答 xff09 三 识别 Identify xff08 请求 xff09 四 识别 Identify xff08 应答 xff09 DCP全称Discove
  • PROFINET协议-DCP实践

    这里就上篇文章 Profinet协议解析 DCP 内容进行实践 xff0c 通过实验验证各操作的准确性 xff0c 并且也介绍一些基本的通信分析方法 xff0c 不必使用昂贵的抓包工具 xff08 某东200左右 xff09 xff0c 使
  • Profinet协议解析-过程数据

    新的一篇文章 xff0c 开始讲下一个点 过程数据 过程数据 xff0c 顾名思义 xff0c 就是一直循环传输的数据 xff0c 在整个过程中不间断的传输 xff0c 其每次传输的时间称为同步周期 这点类似于Ethercat中的PDO数据
  • 无题

    漫无目的的写点东西 很多事情在文字面前显得特别无力 xff0c 又不得不用它来描述记录 记得读本科那会儿 xff0c 机械专业被称为一个万金油的行业 xff0c 所以宁愿用一本的分数去一个二本学校 xff0c 也要报机械专业 xff0c 谁
  • PROFINET的时钟同步(一)

    最近发现CSDN的编辑工具越来越不好用了 xff0c 直接用word导出PDF转图片 xff0c 发上来 清晰度受CSDN的影响 xff0c 不是很清楚
  • PROFINET 链路简述

    如上为 Profinet 的简易收发链路图 xff0c 其中收发各有四条路径 xff0c 三个中继桥 租用分别如下 xff1a RX 端 xff1a CTRL xff1a 控制管理帧的通道 xff0c 例如 LLDP 的邻居协议相关帧 xf

随机推荐

  • DSP中GPIO位域

    在TMS320F2812中 xff0c 对于程序中寄存器的名称是如何映射到物理地址的 xff0c 这里做一下详细的讲解 主要应用到三个文件 xff1a CMD h DSP28 GLobalVariableDefs c xff0c 其中CMD
  • 使用UART串口下调试CH376芯片

    CH376是文件管理控制芯片 xff0c 用于单片机系统读写U 盘或者SD 卡中的文件 CH376支持USB设备方式和USB主机方式 xff0c 并且内置了USB通讯协议的基本固件 xff0c 内置了处理Mass Storage海量存储设备
  • Ubuntu(arm)22.04配置清华源

    1 xff0c 清华源地址 地址 xff1a https mirror tuna tsinghua edu cn help ubuntu 2 xff0c 获取ubuntu arm 的源 ubuntu arm 要使用清华源中ubuntu po
  • DGUS调试笔记一

    0 串口的通讯配置 xff1a 在机器背面VHC86芯片有两个焊点 xff0c 若焊点短接 xff0c 即屏工作在TTL电平下 xff0c 默认出厂处于分离状态 xff0c 即RS232电平下 直接将DIN与232的TX相连 xff0c D
  • 使用HAL库函数建立STM32F2工程笔记

    一 建立一个新的文件夹 xff0c 新建三个文件夹User Driver Project xff0c 还可以加一个Doc存放工程的相关说明等等 1 将STM32F2xx的库函数 xff08 HAL函数库 xff09 中的Drivers文件夹
  • STM32伺服编码器接口

    在STM32的高级定时器和一般定时器中有Encoder interface mode xff08 编码器接口 xff09 xff0c TI1和TI2分别对应TIM CH1 和TIM CH2 通道 一 计数规则如下 xff1a 表55的是编码
  • STM32下调试CAN通信

    基本流程 xff1a 1 初始化CAN模块 xff1a 启用CAN时钟 配置CAN功能寄存器 xff08 包括位定时 xff0c 分频等等 xff09 配置CAN过滤器 打开中断 2 初始化I O口 启用GPIO时钟 打开CAN对应的GPI
  • JLINK固件修复

    0 开始前准备工具 1 SAM BA v2 12 exe 用于烧写固件 下载地址 xff1a http download csdn net detail hzt12345hf 9457629 新版本的SAM BA xff08 例如sam b
  • Keil4,Keil5下使用STlink II 仿真调试

    1 关闭Keil软件 2 下载以下压缩包STlink II相关文件 xff0c 包含三个文件ST LINKII KEIL dll xff0c StorAcc dll和TOOLS INI 3 将ST LINKII KEIL dll和StorA
  • Centos下PHP5升级PHP7

    首先下载PHP7安装包 xff0c 使用wget http am1 php net distributions php 7 2 0 tar bz2 或者直接访问下载 xff0c 然后ftp到linux服务器解压压缩包 xff0c tar x
  • STM32F1xx及STM32F2系列串口,SPI配置,CAN配置

    平时常用的串口和SPI配置在这里列出来 xff0c 以便不时之需 xff0c 直接拿过来用 同时指出了STM32F1系列和STM32F2系列经常出现的问题 使用的库函数为标准库函数 xff0c 而非HAL库 一 串口的配置 xff1a ST
  • 嵌入式中缓冲区队列的实现

    在串口 xff0c IIC或SPI以及CAN等通信中 xff0c 往往需要一次性发送一帧完整的数据 xff0c 由于硬件发送的速度问题 xff0c 硬件不能及时发送出去 xff0c 就会导致数据丢失等一系列问题 通常采用建立缓冲区解决 队列
  • FreeRTOS中断优先级,临界区的配置(特别重要)

    一 背景 网上有许多关于FreeRTOS中断优先级的配置资料 xff0c 但是在v10 0中个别配置项发生了变化 xff0c 在这篇文章中详细的介绍了整个优先级管理配置方案 ARM芯片的优先级为0 255 不同的芯片厂商所用的优先级不同 x
  • 推荐EI、SCI期刊及投稿建议-备忘(转)

    推荐EI SCI期刊及投稿建议 备忘 EI检索期刊计算机方面SCI和EI期刊 xff08 EI期刊会议注册前推荐 xff09 大会注册前推荐的EI期刊 xff1a 英文投稿的一点经验 转载 再加两封催稿信 英语不好 xff0c 但意思表达到
  • arm linux的入口部分的代码分析笔记

    原文转载自http bbs chinaunix net thread 2039668 1 1 html xff0c 写的不错 xff0c 在这里首先感谢作者 查看带有图片的文章请移步 https blog zh123 top p 61 27
  • 树莓派上使用python实现LCD1602显示当前ip

    树莓派一般运行Linux操作系统后通过远程控制来运行 xff0c 但是往往由于网络原因导致树莓派分配的ip地址被改变 xff0c 致使需要重新连接屏幕后才能查看树莓派的当前ip 最近手头有个LCD1602 xff0c 所以尝试将通过驱动LC
  • FreeRTOS三种数据结构区别(StreamBuffer,MessageBuffer,Queue)

    转载自博客 xff1a https blog zh123 top p 61 308 Queue队列是最基本的数据结构 xff0c 在FreeRTOS v10 0后提供了另外两种高级数据结构为Streambuffer和MessageBuffe
  • openCV学习之错误记录

    本片blog用来记录平时学习过程中遇到的错误 xff0c 以及解决办法 xff1b 错误1 错误提示 xff1a 在using namespace cv 前缺少一个 原因 xff0c 是在引用的头文件中存在一个类等结束后未加 错误2 cv
  • linux小技巧——使用MobaXterm宏进行linux批量命令执行——一看就会

    场景 xff1a 我们经常登录linux跳板机去查看应用的日志 xff0c 但是看日志的时候 xff0c 需要输入很多的命令 xff0c 这些命令实际上 xff0c 每一次输入都是重复的 xff0c 特别是命令条数较多的时候 xff0c 这
  • FastJson小技巧——@JSONField的史上最全最详细讲解——一看就会

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