说明:fastjson2是一个性能极致并且简单易用的Java JSON库(官方语),本文介绍在Spring Boot项目中如何使用fastjson2。
创建项目
首先,创建一个Maven项目,引入fastjson2依赖,如下:
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> |
| <modelVersion>4.0.0</modelVersion> |
| |
| <parent> |
| <groupId>org.springframework.boot</groupId> |
| <artifactId>spring-boot-starter-parent</artifactId> |
| <version>2.7.12</version> |
| <relativePath/> |
| </parent> |
| |
| <groupId>com.hezy</groupId> |
| <artifactId>fastjson2_demo</artifactId> |
| <version>1.0-SNAPSHOT</version> |
| <name>Archetype - fastjson2_demo</name> |
| <url>http://maven.apache.org</url> |
| |
| <dependencies> |
| <dependency> |
| <groupId>org.springframework.boot</groupId> |
| <artifactId>spring-boot-starter-web</artifactId> |
| </dependency> |
| |
| <dependency> |
| <groupId>org.springframework.boot</groupId> |
| <artifactId>spring-boot-starter-test</artifactId> |
| <scope>test</scope> |
| </dependency> |
| |
| <dependency> |
| <groupId>org.projectlombok</groupId> |
| <artifactId>lombok</artifactId> |
| </dependency> |
| |
| |
| <dependency> |
| <groupId>com.alibaba.fastjson2</groupId> |
| <artifactId>fastjson2</artifactId> |
| <version>2.0.50</version> |
| </dependency> |
| </dependencies> |
| </project> |
| |
复制
创建一个实体类对象,User
| import lombok.*; |
| import java.io.Serializable; |
| |
| @Data |
| public class User implements Serializable { |
| |
| |
| |
| |
| private String id; |
| |
| |
| |
| |
| private String cardNo; |
| |
| |
| |
| |
| private String phone; |
| |
| |
| |
| |
| private String name; |
| |
| |
| |
| |
| private String username; |
| |
| |
| |
| |
| private String password; |
| } |
复制
这里需要注意对象需要实现Serializable
接口,表示该对象实例能被序列化,另外对象需要有全参构造、无参构造(@Data注解自动生成),在分布式项目中,服务之间传输对象(如Dubbo、MQ)底层实现依赖于对象的全参构造,如果对象没有全参构造方法会报错的。
还有,严格来说,对象需要设置一个序列化版本ID,不设置Java虚拟机会自动为其设置。但如果在序列化之后,改动过对象的属性,那么自动设置的序列化版本ID会发生改变,这时候再去反序列化原来生成过的JavaBean数据(如文本、xml文件、缓存中的)就会报错。
| private static final long serialVersionUID = 1L |
复制
这里只是一个Demo,就不讲究了。
使用
先创建一些变量,如下:
| static User user; |
| |
| static String userJson = "{\"id\":\"10001\",\"cardNo\":\"123456194910014896\",\"phone\":\"12345678901\",\"name\":\"hezy\",\"username\":\"hezy\",\"password\":\"123456\"}"; |
| |
| static byte[] userJsonBytes = userJson.getBytes(); |
| |
| static String userJsonArray = "[{\"id\":\"10001\",\"cardNo\":\"123456194910014896\",\"phone\":\"12345678901\",\"name\":\"hezy\",\"username\":\"hezy\",\"password\":\"123456\"}]"; |
| |
| static { |
| user = new User(); |
| user.setId("10001"); |
| user.setCardNo("123456194910014896"); |
| user.setPhone("12345678901"); |
| user.setName("hezy"); |
| user.setUsername("hezy"); |
| user.setPassword("123456"); |
| } |
复制
2.1将JSON解析为JSONObject
| |
| |
| |
| @Test |
| public void jsonToJSONObject() { |
| JSONObject jsonObject1 = JSON.parseObject(userJson); |
| System.out.println(jsonObject1); |
| |
| JSONObject jsonObject2 = JSON.parseObject(userJsonBytes); |
| System.out.println(jsonObject2); |
| } |
复制

2.2 将JSON解析为JSONArray
| |
| |
| |
| @Test |
| public void jsonToJSONArray() { |
| JSONArray jsonArray = JSON.parseArray(userJsonArray); |
| System.out.println(jsonArray.get(0)); |
| } |
复制

2.3 将JSON解析为Java对象
| |
| |
| |
| @Test |
| public void jsonToJavaBean() { |
| User userBean = JSON.parseObject(userJson, User.class); |
| System.out.println(userBean); |
| } |
复制

2.4 将Java对象序列化为JSON
| |
| |
| |
| @Test |
| public void javaBeanToJson() { |
| String jsonString = JSON.toJSONString(user); |
| System.out.println(jsonString); |
| |
| byte[] jsonBytes = JSON.toJSONBytes(userJsonBytes); |
| System.out.println(jsonBytes); |
| } |
复制

2.5 使用JSONObject、JSONArray
2.5.1 获取简单属性
| |
| |
| |
| |
| @Test |
| public void getValue() { |
| JSONObject jsonObject = JSON.parseObject(userJson); |
| String username = jsonObject.getString("username"); |
| System.out.println(username); |
| } |
复制

2.5.2 读取JavaBean
| |
| |
| |
| |
| @Test |
| public void getJavaBean() { |
| JSONArray jsonArray = JSON.parseArray(userJsonArray); |
| JSONObject jsonObject = JSON.parseObject(userJson); |
| |
| User userBean = jsonArray.getObject(0, User.class); |
| System.out.println(userBean); |
| |
| |
| String username = jsonObject.getObject("username", String.class); |
| System.out.println(username); |
| } |
复制

2.5.3 转为JavaBean
| |
| |
| |
| |
| @Test |
| public void toJavaBean() { |
| JSONArray jsonArray = JSON.parseArray(userJsonArray); |
| JSONObject jsonObject = JSON.parseObject(userJson); |
| |
| User user = jsonObject.toJavaObject(User.class); |
| System.out.println(user); |
| |
| List<User> users = jsonArray.toJavaList(User.class); |
| System.out.println(users); |
| } |
复制

2.6 将JavaBean对象序列化为JSON
| |
| |
| |
| @Test |
| public void javaBeanObjectToJson() { |
| String jsonString = JSON.toJSONString(user); |
| System.out.println(jsonString); |
| |
| byte[] jsonBytes = JSON.toJSONBytes(user); |
| System.out.println(jsonBytes); |
| } |
复制

相关注解
| @Data |
| @JSONType(orders = {"id", "cardNo", "phone", "name", "username", "password"}) |
| public class User implements Serializable { |
| …… |
| } |
复制
如上面2.6方法,加上上面的注解后重新启动,结果如下,序列化后属性顺序改变了:

- @JSONField(name = “”):指定该属性序列化时的名称;
| |
| |
| |
| @JSONField(name = "realName") |
| private String name; |
复制
如上面2.6方法,加上注解后重新启动,结果如下,序列化后的name
变为realName

- @JsonFormat(pattern = “yyyy-MM-dd”, timezone = “GMT+8”):日期格式化成
yyyy-MM-dd
,时区为东八区;
创建一个日期属性,如下:
| |
| |
| |
| @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") |
| private Date birthday; |
复制
赋值,当前日期
| user.setBirthday(new Date()); |
复制
打印序列化前后的内容
| |
| |
| |
| @Test |
| public void javaBeanObjectToJson() { |
| System.out.println(user); |
| |
| String jsonString = JSON.toJSONString(user); |
| System.out.println(jsonString); |
| } |
复制
可以看到日期格式发生了改变

总结
集中去看API毫无意义,因为看了、敲了,用的时候也会忘,而且这些API名称看起来都差不多,不好区分。用的时候再去查(源码、百度、GPT)也都来得及,后面的注解值得一看。