Fastjson妙用之@JSONField注解
在开发的过程中使用json格式的地方非常多,现在前后端分离的项目中,前后端数据交换的格式一般为json,这种格式的优/缺点这里不再赘述,感兴趣的可以百度。把java中的实体类序列化为json的方式也有很多方式,今天来看看常用到的fastjson。
都知道fastjson是阿里开源的一个序列化/反序列化的jar包,在日常的开发过程中经常会碰到,也是使用频率较高的一款工具。
这里要了解一个概念,那就是序列化/反序列化,序列化是把一个java对象转化为其他的形式,如json、XML、对象字节;反序列化则是把json、XML、对象字节转化为java对象。
一、初始Fastjson
1、环境搭建
要想使用fastjson,首先需要引入fastjson的包,我这里使用的是maven工具,所以这里只要在pom文件中添加相应的依赖即可,
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
2、一个小例子
有一个实体类,
package com.atssg.test; import lombok.Data; @Data
public class Student {
private Integer id;
private String name;
private String address;
private String phoneNumber; }
下面看测试方法
package com.atssg.test; import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j; @Slf4j
public class TestFastJson {
public static void main(String[] args) {
Student student=new Student();
student.setId(1);
student.setName("tom");
student.setAddress("beijing");
student.setPhoneNumber("010-6668899"); //把对象转化为json串
String jsonString=JSON.toJSONString(student);
log.info("student序列化为:{}",jsonString);
}
}
下面看测试结果
22:22:41.657 [main] INFO com.atssg.test.TestFastJson - student序列化为:{"address":"beijing","id":1,"name":"tom","phoneNumber":"010-6668899"} Process finished with exit code 0
从上面可以看到打印除了序列化为json的字符串,这里是一个序列化的过程,当然也可以把一个字符串反序列化为java对象。
二、@JSONField注解
在上面的例子中,student被序列化为一个json字符串,字符串是键值对的形式,键是Student的属性名。
现在有这样的一个需求,要返回给前端Student的json字符串,但不想给前端phoneNumber字段,你要怎么做那?一个比较容易想到的方式是从字符串中把这个属性去掉,或者重新生成一个不包含phoneNumber的实体对象。难道没有更好的方式么
在fastjson提供了@JSONField这样一个注解。
1、@JSONField(serialize = false)
@JSONField注解中有seaialize这样一个属性,看名称应该和序列化有关,尝试下看看效果,
package com.atssg.test; import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data; @Data
public class Student {
private Integer id;
private String name;
private String address;
@JSONField(serialize = false)
private String phoneNumber; }
再看上面的测试类的执行结果,
22:30:26.678 [main] INFO com.atssg.test.TestFastJson - student序列化为:{"address":"beijing","id":1,"name":"tom"} Process finished with exit code 0
可以看到轻轻松松phoneNumber不见了,也就是说@JSONField(serialize=false)起作用了,该属性不会参与序列化,反之,不加该注解或serialize的值设为true,则会参与序列化。
2、@JSONField(name= "XXX")
在和前端的交互过程中,可能存在这样的情况,java类中定义的字段的形式为驼峰,但前端需要的是以_连接的形式,要怎么做那,在@JSONField中有name属性,
package com.atssg.test; import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data; @Data
public class Student {
private Integer id;
private String name;
private String address;
@JSONField(name = "phone_number")
private String phoneNumber; }
在phoneNuber上注解@JSONField且name为phone_number,看测试结果,
21:47:48.766 [main] INFO com.atssg.test.TestFastJson - student序列化为:{"address":"beijing","id":1,"name":"tom","phone_number":"010-6668899"}
可以看到在序列化的json字符串中出现了phone_number,说明@JSONField起了作用,在序列化的时候指定序列化字段的名称,如果指定了使用指定的(@JSONField中name的值),如果不指定使用java类中属性的名字。
3、@JSONField注解
在上面,我们看了@JSONField的两种用法,还有很多用法,这里不一一列举,看下@JSONField这个注解的定义,
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
// package com.alibaba.fastjson.annotation; import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
public @interface JSONField {
int ordinal() default 0; String name() default ""; String format() default ""; boolean serialize() default true; boolean deserialize() default true; SerializerFeature[] serialzeFeatures() default {}; Feature[] parseFeatures() default {}; String label() default ""; boolean jsonDirect() default false; Class<?> serializeUsing() default Void.class; Class<?> deserializeUsing() default Void.class; String[] alternateNames() default {}; boolean unwrapped() default false; String defaultValue() default "";
}
在这个注解上使用了@Target注解标注,@Target中的值为{ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER},也就是说@JSONField可以标注在方法上、字段、参数上。在上面的例子中,我们把@JSONField用在了字段上,下面看使用在方法上的例子,在一个类中有getXXX/setXXX方法,看@JSONField用在getXXX/setXXX的用法。
package com.atssg.test; import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data; @Data
public class Student {
private Integer id;
private String name;
private String address; private String phoneNumber; //getXXX方法用在序列化过程中
@JSONField(serialize = false)
public String getPhoneNumber() {
return phoneNumber;
} //setXXX方法用在反序列化过程中
@JSONField(deserialize = false)
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
看测试结果
21:59:28.334 [main] INFO com.atssg.test.TestFastJson - student序列化为:{"address":"beijing","id":1,"name":"tom"}
再来看反序列化的测试结果,测试类,
package com.atssg.test; import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j; @Slf4j
public class TestFastJson {
public static void main(String[] args) {
Student student=new Student();
student.setId(1);
student.setName("tom");
student.setAddress("beijing");
student.setPhoneNumber("010-6668899"); //把对象转化为json串
String jsonString=JSON.toJSONString(student);
log.info("student序列化为:{}",jsonString);
//反序列化
String str="{\"address\":\"beijing\",\"id\":1,\"name\":\"tom\",\"phoneNumber\":\"010-6668899\"}";
Student stu=JSON.parseObject(str,Student.class);
log.info("反序列化的结果:{}",stu); }
}
使用了含有phoneNumber的字符串,看反序列化的结果,
22:04:04.746 [main] INFO com.atssg.test.TestFastJson - student序列化为:{"address":"beijing","id":1,"name":"tom"}
22:04:04.776 [main] INFO com.atssg.test.TestFastJson - 反序列化的结果:Student(id=1, name=tom, address=beijing, phoneNumber=null)
可以看到phoneNumber的值为null,证明该属性未取得反序列化的值,证明了@JSONField用在setXXX方法上起到了反序列化的控制作用。
三、总结
本文分享了fastjson中@JSONField的用法,主要是在序列化/反序列化的过程中,主要体现在以下几个方面,
1、@JSONField用在字段上影响序列化/反序列化两个过程;
2、@JSONField用在setXXX、getXXX方法上,分别影响反序列化、序列化过程;
有不正指出,欢迎指正!
Fastjson妙用之@JSONField注解的更多相关文章
- fastjson的@JSONField注解的一点问题
@JSONField 看源码它可以作用于字段和方法上. 引用网上说的, 一.作用Field @JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称. 但是 ...
- fastjson简单使用demo,@JSONField注解属性字段上与set、get方法上。实体类toString(),实体类转json的区别;_下划线-减号大小写智能匹配
一.demo代码 @JSONField注解属性字段上与set.get方法上.使用@Data注解(lombok插件安装最下方),对属性“笔名”[pseudonym]手动重写setter/getter方法 ...
- @JSONField 注解说明
转自:https://blog.csdn.net/suyimin2010/article/details/80617538 导入@JSONField 注解: import com.alibaba.fa ...
- FastJson踩坑:@JsonField在反序列化时失效
问题描述 一个对象(某个字段为枚举类型,为了不采用默认的序列化过程,用@JSONField指定了序列化器和反序列器,过程见旧博文),将其放到JSONArray中再序列化JSONArray对象,用得到的 ...
- FastJson中@JSONField注解使用
最近做项目中,使用了json格式在服务器之间进行数据传输.但是发现json格式数据不符合JAVA中的变量定义规则,并且难以理解,因此需要在后台中做二次处理,将数据处理成我们系统中定义的格式. 思路: ...
- fastjson的@JSONField注解
@JSONField作用:在字段和方法上1.Field:@JSONField作用在Field时,name可以定义输入key的名字,反序列化的时 值不会赋值到属性上2.作用在setter和getter方 ...
- @JSONField注解的使用
FastJson中的注解@JSONField,一般作用在get/set方法上面,常用的使用场景有下面三个: 修改和json字符串的字段映射[name] 格式化数据[format] 过滤掉不需要序列化的 ...
- fastJson注解@JSONField使用的一个实例
1.实体类 package jsonArrayjsonObject.cn; import java.io.Serializable; import java.util.Date; import com ...
- 【源码分析】FastJson全局配置日期格式导致@JSONField(format = "yyyy-MM-dd")注解失效
出现的问题 我全局配置的时间格式是:yyyy-MM-dd HH:mm:ss @JSONField注解配置的时间格式是:yyyy-MM-dd 最终的返回结果是:yyyy-MM-dd HH:mm:ss 问 ...
随机推荐
- Jmeter压测学习1—第一个项目:登录
我用的是我们公司的测试环境练习的 网址:http://****:9000/login.html 账号是admin 密码:123456 一.打开Jmeter 找到安装目录:bin->Jmeter ...
- 2017年第二届广东省强网杯线上赛WEB:Musee de X writeup(模板注入漏洞)
目录 解题思路 总结 解题思路 拿到手上,有四个页面 首先按照题目要求执行,尝试注册一个名为admin的账户 这种情况,路径都给出来了,很可能就是目录遍历或者文件上传了 回到初始界面,点击链接here ...
- 小米路由器4a千兆版刷openwrt
现在网上搜小米路由器4a千兆版刷机的都是刷的padavan的,很少能找到openwrt的刷机教程. 首先刷openwrt系统的时候要先刷入引导程序breed,网上有一篇帖子写的很详细(https:// ...
- SpringCloud升级之路2020.0.x版-25.OpenFeign简介与使用
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent OpenFeign 的由来和实现思路 在微服务系统中,我们经常会进行 RPC 调用.在 S ...
- vue组件的生命周期详解
1.生命周期&生命周期函数 生命周期:指一个组件从创建->运行->销毁的整个阶段,强调的是一个时间段. 生命周期函数:由vue框架提供的内置函数,会伴随着组件的生命周期,自动按序执 ...
- LuoguP1557 Kruscal的加法 题解
题目Link 就是这道题,做了我整整一天! 看到题目,首先想到的就是:就这?就这一道大水题也能是绿?然后十分钟写完代码,提交-- 果不其然,绿题不是白绿的,看了一眼数据和讨论,又得写高精了-- 先附上 ...
- NOIP 模拟九 考试总结
T1 考场上先干的T2,最后慌慌张张没去想正解,打算把树建起来,拿70分的部分分,于是写树剖LCA,板子好像忘了,回忆了好久还模拟了好几遍才打对树剖LCA............期望70,结果0.考试 ...
- Go语言核心36讲(导读)--学习笔记
目录 开篇词 | 跟着学,你也能成为Go语言高手 导读 | 写给0基础入门的Go语言学习者 导读 | 学习专栏的正确姿势 开篇词 | 跟着学,你也能成为Go语言高手 Go 语言是由 Google 出品 ...
- dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)
qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...
- vue基本指令与脚手架基本配置
脚手架(@vue/cli)创建项目启动服务 1.创建项目 vue create 项目名字 2.启动项目 进入项目根目录,运行以下命令 yarn serve 3.脚手架目录代码分析 ├── node_m ...