文章目录
1、简介
1.1 Fastjson 简介
- Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
- Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。
- Fastjson 源码地址:https://github.com/alibaba/fastjson
- Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN
1.2 Maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wujiang.test</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<fastjson_version>1.2.28</fastjson_version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson_version}</version>
</dependency>
</dependencies>
</project>
2、JSON.toJSONString
2.1 将Java对象转化为Json字符串
- JSON.toJSONString() 将Java对象转化为Json字符串
- 使用
@JSONField
注解,其作用对象有两个- 配置在Field上(字段)
- 配置在setter 和 getter 方法上
public class A {
@JSONField(name="ID")
private int id;
public int getId() {return id;}
public void setId(int value) {this.id = id;}
}
public class A {
private int id;
@JSONField(name="ID")
public int getId() {return id;}
@JSONField(name="ID")
public void setId(int value) {this.id = id;}
}
- 注意:FastJson 在进行操作时,是根据 getter 和 setter 的方法进行的,并不是依据 Field 进行。
- 注意:
若属性是私有的,必须有 set 方法,否则无法反序列化
。
定义以下 Person JavaBean:
package org.Json_;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Data
@AllArgsConstructor
public class Person {
@JSONField(name="SEX", serialize=false)
private String sex;
@JSONField(name = "AGE", ordinal = 2)
private int age;
@JSONField(name = "FULL NAME", ordinal = 1)
private String fullName;
@JSONField(name = "DATE OF BIRTH",format="dd/MM/yyyy", ordinal = 3)
private Date dateOfBirth;
public Person(){
}
public Person(int age, String fullName, Date dateOfBirth) {
this.age = age;
this.fullName= fullName;
this.dateOfBirth = dateOfBirth;
}
// 一定要确保有setter与getter方法,否则输出不符合预期:[{},{}]
// 使用@Data注解就是为了保证有setter与getter方法
public static void main(String[] args) {
List<Person> listOfPersons = new ArrayList();
Person p1 = new Person("男", 15, "John Doe", new Date());
listOfPersons.add(p1);
Person p2 = new Person("女", 20, "Janette Doe", new Date());
listOfPersons.add(p2);
/**
* Case 1、使用 JSON.toJSONString() 将 Java 对象转换换为 JSON 对象
* - 默认 fastjson 序列化一个 java bean,是根据 fieldName 的字母序进行序列化的,你可以通过 ordinal 指定字段的顺序
* - 使用format 参数用于格式化 date 属性
* - 默认情况下, FastJson 库可以序列化 Java bean 实体, 但我们可以使用 serialize 指定字段不序列化。
*/
String jsonOutput= JSON.toJSONString(listOfPersons);
System.out.println(jsonOutput);
/**
* Case 2、如果需要将转换为json字符串的List的转回来,需要使用JSON.parseArray方法
*/
List<Person> jsonStrToList = JSON.parseArray(jsonOutput,Person.class);
System.out.println(jsonStrToList);
System.out.println(jsonStrToList.get(1).getFullName());
/**
* Case 3、FastJson 还支持 BeanToArray 序列化功能:
*/
String jsonOutputArray= JSON.toJSONString(listOfPersons, SerializerFeature.BeanToArray);
System.out.println(jsonOutputArray);
}
}
Case 1
:从下面👇的输出结果可以看出,若对字段sex不进行序列化,得到的结果中没有该字段:
@JSONField(name="SEX", serialize=false)
private String sex;
[{"FULL NAME":"John Doe","AGE":15,"DATE OF BIRTH":"15/08/2021"},{"FULL NAME":"Janette Doe","AGE":20,"DATE OF BIRTH":"15/08/2021"}]
@JSONField(name="SEX")
private String sex;
[{"SEX":"男","FULL NAME":"John Doe","AGE":15,"DATE OF BIRTH":"15/08/2021"},{"SEX":"女","FULL NAME":"Janette Doe","AGE":20,"DATE OF BIRTH":"15/08/2021"}]
Case 2
: 在对性别sex不序列化的情况下,如果需要将转换为json字符串的List的转回来,需要使用JSON.parseArray方法
[Person(sex=null, age=15, fullName=John Doe, dateOfBirth=Sun Aug 15 00:00:00 CST 2021), Person(sex=null, age=20, fullName=Janette Doe, dateOfBirth=Sun Aug 15 00:00:00 CST 2021)]
Janette Doe
2.2 FastJson 还支持 BeanToArray 序列化功能
- JSON.parseObject(),是将Json字符串转化为相应的对象
String jsonOutputArray= JSON.toJSONString(listOfPersons, SerializerFeature.BeanToArray);
Case 3:
在对性别sex不序列化的情况下,得到的输出为:
[["John Doe",15,"15/08/2021"],["Janette Doe",20,"15/08/2021"]]
3、JSON.parseObject
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Date;
@Data
@AllArgsConstructor
public class Person_reverse {
@JSONField(name="SEX", serialize=false)
private String sex;
@JSONField(name = "AGE", ordinal = 2)
private int age;
@JSONField(name = "NAME", ordinal = 1)
private String fullName;
@JSONField(name = "BIRTH",format="dd/MM/yyyy", ordinal = 3, deserialize = false)
private Date dateOfBirth;
public Person_reverse(){
}
public static void main(String[] args) {
/**
* 使用 JSON.parseObject() 将 JSON 字符串转换为 Java 对象。
* - 注意反序列化时为对象时,必须要有默认无参的构造函数,否则会报异常
* - @JSONField deserialize 可以指定字段不反序列化
*/
Person_reverse person = new Person_reverse("男", 20, "John Doe", new Date());
// 指定字段不序列化,所以在Json字符串中没有sex
String jsonObject = JSON.toJSONString(person);
System.out.println(jsonObject); // {"NAME":"John Doe","AGE":20,"BIRTH":"15/08/2021"}
// 指定字段不反序列化,所以dateOfBirth为null
Person_reverse newPerson = JSON.parseObject(jsonObject, Person_reverse.class);
System.out.println(newPerson); // Person_reverse(sex=null, age=20, fullName=John Doe, dateOfBirth=null)
System.out.println("----------------------------------------------");
/**
* 故意在Json字符串中多了一个Temp,少了一个Person中的dateOfBirth
* - 这里的key值要与@JSONField(name = "NAME")中的值对应(不区分大小写)
*/
String jsonString = "{sex:'女', age:'100', name:'A B', telephone:'88888'}";
// 对于Person_reverse类有的属性,而Json字符串中没有,会为null
// 对于Json字符串有的属性,而Person_reverse类有的属性,不做任何处理
Person_reverse instance = JSON.parseObject(jsonString, Person_reverse.class);
System.out.println(instance); // Person_reverse(sex=女, age=100, fullName=A B, dateOfBirth=null)
String jsonStr = JSON.toJSONString(instance);
System.out.println(jsonStr); // {"NAME":"A B","AGE":100}
}
}
输出为:
{"NAME":"John Doe","AGE":20,"BIRTH":"15/08/2021"}
Person_reverse(sex=null, age=20, fullName=John Doe, dateOfBirth=null)
----------------------------------------------
Person_reverse(sex=女, age=100, fullName=A B, dateOfBirth=null)
{"NAME":"A B","AGE":100}
参考:https://www.runoob.com/w3cnote/fastjson-intro.html
参考:https://blog.csdn.net/antony9118/article/details/71023009