使用 fastjson 当然先要导入 JAR 包,下面是 maven 依赖的地址
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.73version>
dependency>
先准备一个 Use 和 Grade 类
package top.shijialeya.po;
public class User {
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package top.shijialeya.po;
import java.util.ArrayList;
import java.util.List;
public class Grade {
private String name;
private List<User> users = new ArrayList<User>();
public Grade() {
}
public Grade(String name, List<User> users) {
this.name = name;
this.users = users;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
@Override
public String toString() {
return "Grade{" +
"name='" + name + '\'' +
", users=" + users +
'}';
}
}
序列化
把 JavaBean 对象转成 JSON 格式的字符串
将对象转为 JOSN 字符主要使用到 JSON.toJSONString(Object)
@Test
public void test01() {
//简单 java 类转换成 JSON
User user = new User("张三", 18);
String userJSONString = JSON.toJSONString(user);
System.out.println(userJSONString);
}
结果:
{"age":18,"name":"张三"}
@Test
public void test02() {
//List
User u1 = new User("张三", 18);
User u2 = new User("李四", 19);
User u3 = new User("王五", 20);
List<User> us = new ArrayList<>();
us.add(u1);
us.add(u2);
us.add(u3);
//SerializerFeature.UseSingleQuotes 使用单引号
String usJSONString = JSON.toJSONString(us, SerializerFeature.UseSingleQuotes);
System.out.println(usJSONString);
}
结果:
[{'age':18,'name':'张三'},{'age':19,'name':'李四'},{'age':20,'name':'王五'}]
@Test
public void test03() {
//Map 转 json,JSON 格式化
User u1 = new User("张三", 18);
User u2 = new User("李四", 19);
HashMap<String, User> map = new HashMap<>();
map.put("key01", u1);
map.put("key02", u2);
//SerializerFeature.PrettyFormat JSON 格式化
String mapJSONString = JSON.toJSONString(map, SerializerFeature.PrettyFormat);
System.out.println(mapJSONString);
}
结果:
{
"key02":{
"age":19,
"name":"李四"
},
"key01":{
"age":18,
"name":"张三"
}
}
@Test
public void test04() {
//复杂 Java 类转 JSON 字符串,输出 Null 字段。
User u1 = new User("张三", 18);
User u2 = new User(null, 19);
List<User> us = new ArrayList<>();
us.add(u1);
us.add(u2);
Grade grade = new Grade("华软", us);
//缺省情况下 FastJSON 不输入为值 Null 的字段,可以使用 SerializerFeature.WriteMapNullValue 使其输出。
//SerializerFeature.WriteClassName 序列化写入类型信息
String gradeJSONString = JSON.toJSONString(grade, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteClassName);
System.out.println(gradeJSONString);
}
结果:
{"@type":"top.shijialeya.po.Grade","name":"华软","users":[{"age":18,"name":"张三"},{"age":19,"name":null}]}
@Test
public void test05() {
//对日期类进行个格式化
String dateJSONString = JSON.toJSONString(new Date(), SerializerFeature.WriteDateUseDateFormat);
System.out.println(dateJSONString);
//指定输出的日期格式
String dataJSON = JSON.toJSONStringWithDateFormat(new Date(), "yyyy-MM-dd HH:mm:ss.SSS");
System.out.println(dataJSON);
}
结果:
"2020-11-18 17:16:04"
"2020-11-18 17:16:04.951"
反序列化
将 JSON 字符转换为 Java 对象
@Test
public void test01() {
//json 转简单的 Java 对象
String json = "{'age':18,'name':'张三'}";
User user = JSON.parseObject(json, User.class);
System.out.println(user);
}
结果:
User{name='张三', age=18}
@Test
public void test02() {
//json 转 List 数组
String arrJson = "[{'age':18,'name':'张三'},{'age':19,'name':'李四'}]";
List<User> userList = JSON.parseArray(arrJson, User.class);
System.out.println(userList);
}
结果:
[User{name='张三', age=18}, User{name='李四', age=19}]
@Test
public void test03() {
//json 转复杂类型的 Java 对象
String jsonObject = "{'name':'华软','users':[{'age':18,'name':'张三'},{'age':19,'name':'李四'}]}";
Grade grade = JSON.parseObject(jsonObject, Grade.class);
System.out.println(grade);
}
结果:
Grade{name='华软', users=[User{name='张三', age=18}, User{name='李四', age=19}]}
@Test
public void test04() {
//json 转 List
String json = "[{'name':'华软','site':'太平'},{'name':'软件','users':'广从南路'}]";
List<Map> mapList = JSON.parseArray(json, Map.class);
for (Map map : mapList) {
Set set = map.keySet();
for (Object o : set) {
System.out.println(o + " -> " + map.get(o));
}
}
}
结果:
site -> 太平
name -> 华软
name -> 软件
users -> 广从南路
@Test
public void test05() {
//json 转 泛型 ( Map> )
String json = "{'hr':[{'age':18,'name':'张三'},{'age':19,'name':'李四'}],'rj':[{'age':20,'name':'王五'},{'age':21,'name':'赵六'}]}";
Map<String, List<User>> map = JSON.parseObject(json, new TypeReference<Map<String, List<User>>>() {
});
Set<String> keys = map.keySet();
for (String key : keys) {
List<User> users = map.get(key);
System.out.println(key + " -> " + users);
}
}
结果:
rj -> [User{name='王五', age=20}, User{name='赵六', age=21}]
hr -> [User{name='张三', age=18}, User{name='李四', age=19}]
在主方法的目录下创建一个 query.json 文件,内容如下:
[
{
"name": "华软",
"users": [
{
"age": 18,
"name": "张三"
},
{
"age": 19,
"name": "李四"
}
]
},
{
"name": "软件",
"users": [
{
"age": 20,
"name": "王五"
},
{
"age": 21,
"name": "赵六"
}
]
}
]
对该 JSON 文件进行转换
@Test
//复杂的 json 转 Java 对象
public void testTwo() throws IOException {
//读取 query.json 文件的 json 数据
ClassLoader cl = this.getClass().getClassLoader();
InputStream inputStream = cl.getResourceAsStream("query.json");
//需要导入 commons-io 包
String jsonString = IOUtils.toString(inputStream, "utf-8");
//先把外成转成数组
List<Grade> grades = JSON.parseArray(jsonString, Grade.class);
System.out.println(grades);
}
运行结果:
[Grade{name='华软', users=[User{name='张三', age=18}, User{name='李四', age=19}]}, Grade{name='软件', users=[User{name='王五', age=20}, User{name='赵六', age=21}]}]
commons-io 包坐标
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
<version>2.4version>
dependency>