文章目录
一、fastjson2
1、简介
FASTJSON v2是FASTJSON项目的重要升级,目标是为下一个十年提供一个高性能的JSON库。与fastjson使用同一套API。
fastjson v1版本已经被淘汰了,所以以后就直接用fastjson v2版本。
官方文档:https://alibaba.github.io/fastjson2/
2、使用
xml
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.60</version>
</dependency>
在fastjson v2中,package和1.x不一样,是com.alibaba.fastjson2。如果你之前用的是fastjson1,大多数情况直接更包名就即可。
java
// 1 将JSON解析为JSONObject
String text = "...";
JSONObject data = JSON.parseObject(text);
byte[] bytes = ...;
JSONObject data = JSON.parseObject(bytes);
// 2 将JSON解析为JSONArray
String text = "...";
JSONArray data = JSON.parseArray(text);
// 3 将JSON解析为Java对象
String text = "...";
User data = JSON.parseObject(text, User.class);
// 4 将Java对象序列化为JSON
Object data = "...";
String text = JSON.toJSONString(data);
byte[] text = JSON.toJSONBytes(data);
// 5. 获取简单属性
String text = "{\"id\": 2,\"name\": \"fastjson2\"}";
JSONObject obj = JSON.parseObject(text);
int id = obj.getIntValue("id");
String name = obj.getString("name");
String text = "[2, \"fastjson2\"]";
JSONArray array = JSON.parseArray(text);
int id = array.getIntValue(0);
String name = array.getString(1);
// 6。读取JavaBean
JSONArray array = ...
JSONObject obj = ...
User user = array.getObject(0, User.class);
User user = obj.getObject("key", User.class);
// 7.转为JavaBean
JSONArray array = ...
JSONObject obj = ...
User user = obj.toJavaObject(User.class);
List<User> users = array.toJavaList(User.class);
// 8.将JavaBean对象序列化为JSON
class User {
public int id;
public String name;
}
User user = new User();
user.id = 2;
user.name = "FastJson2";
String text = JSON.toJSONString(user);
byte[] bytes = JSON.toJSONBytes(user);
java
// 1 将JavaBean对象序列化JSONB
User user = ...;
byte[] bytes = JSONB.toBytes(user);
byte[] bytes = JSONB.toBytes(user, JSONWriter.Feature.BeanToArray);
// 2 将JSONB数据解析为JavaBean
byte[] bytes = ...
User user = JSONB.parseObject(bytes, User.class);
User user = JSONB.parseObject(bytes, User.class, JSONReader.Feature.SupportBeanArrayMapping);
// 3 使用JSONPath读取部分数据
String text = ...;
JSONPath path = JSONPath.of("$.id"); // 缓存起来重复使用能提升性能
JSONReader parser = JSONReader.of(text);
Object result = path.extract(parser);
// 4 使用JSONPath读取部分byte[]的数据
byte[] bytes = ...;
JSONPath path = JSONPath.of("$.id"); // 缓存起来重复使用能提升性能
JSONReader parser = JSONReader.of(bytes);
Object result = path.extract(parser);
// 5 使用JSONPath读取部分byte[]的数据
byte[] bytes = ...;
JSONPath path = JSONPath.of("$.id"); // 缓存起来重复使用能提升性能
JSONReader parser = JSONReader.ofJSONB(bytes); // 注意这里使用ofJSONB方法
Object result = path.extract(parser);
3、踩坑:转为List类型,类型擦除,匹配失败
(1)引出错误
观察以下错误:
我们发现,通过JSON.parseObject转换List的时候,因为类型擦除并不会异常,当真正开始使用转换后的对象时,会提示类型转换异常!
java
import com.alibaba.fastjson2.JSON;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
users.add(new User(1, "张三"));
users.add(new User(2, "李四"));
users.add(new User(3, "王五"));
String usersJson = JSON.toJSONString(users);
// [{"id":1,"name":"张三"},{"id":2,"name":"李四"},{"id":3,"name":"王五"}]
System.out.println(JSON.toJSONString(usersJson));
List<User> usersList1 = JSON.parseObject(usersJson, List.class);
System.out.println(usersList1);
// 下面会报错!!java.lang.ClassCastException: com.alibaba.fastjson2.JSONObject cannot be cast to com.demo.springbootdemo.test.User
System.out.println(usersList1.get(0).getId());
}
}
class User {
private Integer id;
private String name;
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
(2)正确转换List
java
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
users.add(new User(1, "张三"));
users.add(new User(2, "李四"));
users.add(new User(3, "王五"));
String usersJson = JSON.toJSONString(users);
// [{"id":1,"name":"张三"},{"id":2,"name":"李四"},{"id":3,"name":"王五"}]
System.out.println(JSON.toJSONString(usersJson));
// List<User> usersList1 = JSON.parseObject(usersJson, List.class);
// System.out.println(usersList1);
// // 下面会报错!!java.lang.ClassCastException: com.alibaba.fastjson2.JSONObject cannot be cast to com.demo.springbootdemo.test.User
// System.out.println(usersList1.get(0).getId());
// 1.使用parseArray方法转为list
List<User> usersList2 = JSON.parseArray(usersJson, User.class);
System.out.println(usersList2);
System.out.println(usersList2.get(0).getId());
// 2.使用parseObject方法 + TypeReference
List<User> userList3 = JSON.parseObject(usersJson, new TypeReference<List<User>>() {});
System.out.println(userList3);
System.out.println(userList3.get(0).getId());
}
}
class User {
private Integer id;
private String name;
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}