天涯论坛

 找回密码
 立即注册
搜索
查看: 27|回复: 2

Fastjson妙用之@JSONField注解

[复制链接]

3107

主题

176

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098703
发表于 2024-10-10 03:54:19 | 显示全部楼层 |阅读模式

研发的过程中运用json格式的地区非常多,此刻前后端分离的项目中,前后端数据交换的格式通常为json,这种格式的优/缺点这儿再也不赘述,感兴趣的能够百度。把java中的实体类序列化为json的方式非常多方式,今天来瞧瞧常用到的fastjson。

晓得fastjson是阿里开源的一个序列化/反序列化的jar包,在平常研发过程中经常会碰到,运用频率较高的一款工具。

这儿认识一个概念,那便是序列化/反序列化,序列化是把一个java对象转化为其他的形式,如json、XML、对象字节;反序列化则是把json、XML、对象字节转化为java对象。

1、初识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对象。

2、@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办法上起到了反序列化的掌控功效

3、总结

本文分享了fastjson中@JSONField的用法,重点是在序列化/反序列化的过程中,重点表现在以下几个方面,

@JSONField用在字段上影响序列化/反序列化两个过程;@JSONField用在setXXX、getXXX办法上,分别影响反序列化、序列化过程;




上一篇:红蓝对抗|常用攻防工具大全
下一篇:web前端研发 后端研发
回复

使用道具 举报

3048

主题

2万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109040
发表于 2024-10-30 05:26:30 | 显示全部楼层
楼主继续加油啊!外链论坛加油!
回复

使用道具 举报

3048

主题

2万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109040
发表于 2024-11-7 06:16:48 | 显示全部楼层
回顾历史,我们感慨万千;放眼未来,我们信心百倍。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 01:11 , Processed in 0.097458 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.