文章目录
- 一. Fastjson概述
- 二. Fastjson的常用方法
- 1. Java对象-> JSON字符串
- 2. JSON 字符串->Java 对象
- 3. 创建JSON对象
- 三. @JSONField注解
- 1. @JSONField注解概述
- 2. @JSONField的配置方式
- 1. `name`:序列化对象的名称
- 2. `ordinal`:指定字段的顺序
- 3. `format `:格式化 Date 属性
- 4. `serialize/deserialize `:指定不序列化/反序列化的字段
- 5. 示例
- 四. 反序列化的其他情况
- 参考资料
一. Fastjson概述
- Fastjson 是一个 Java 库,提供了Java 对象与 JSON 相互转换。
- toJSONString()方法:(序列化)将json对象转换成JSON字符串;
- parseObject()方法:(反序列化)将JSON字符串转换成json对象。
- 注意
- FastJson 在进行操作时,是根据 getter 和 setter 的方法进行的,并不是依据 Field 进行,因此实体类必须有getter和setter方法。
- 若属性是私有的,必须有 setter方法,否则无法反序列化。
- Fastjson的maven依赖
- maven中央仓库下载:http://repo1.maven.org/maven2/com/alibaba/fastjson/
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>x.x.x</version>
</dependency>
二. Fastjson的常用方法
1. Java对象-> JSON字符串
-
JSON.toJSONString()
:将 Java 对象转换为 JSON 字符串。
// 定义Person JavaBean
public class Person {
@JSONField(name = "AGE")
private int age;
@JSONField(name = "FULL NAME")
private String fullName;
@JSONField(name = "DATE OF BIRTH")
private Date dateOfBirth;
public Person(int age, String fullName, Date dateOfBirth) {
super();
this.age = age;
this.fullName= fullName;
this.dateOfBirth = dateOfBirth;
}
// 标准 getters & setters方法:必须写
}
// 测试
public class StrToJsonTest {
private List<Person> listOfPersons = new ArrayList<Person>();
public static void main(String[] args) {
listOfPersons.add(new Person(15, "John Doe", new Date()));
listOfPersons.add(new Person(20, "Janette Doe", new Date()));
// 执行toJSONString()方法
String jsonOutput= JSON.toJSONString(listOfPersons);
}
- 输出结果
[
{
"AGE":15,
"DATE OF BIRTH":1468962431394,
"FULL NAME":"John Doe"
},
{
"AGE":20,
"DATE OF BIRTH":1468962431394,
"FULL NAME":"Janette Doe"
}
]
2. JSON 字符串->Java 对象
-
JSON.parseObject()
: 将 JSON 字符串转换为 Java 对象。 - 注意:该方法反序列化为对象时,必须要有默认无参的构造函数,否则会报异常。
@Test
public void whenJson_thanConvertToObjectCorrect() {
Person person = new Person(20, "John "Doe", new Date());
String jsonObject = JSON.toJSONString(person);
Person newPerson = JSON.parseObject(jsonObject, Person.class);
}
- 运行结果
Person [age=20, fullName=John Doe, dateOfBirth=Wed Jul 20 08:51:12 WEST 2016]
3. 创建JSON对象
- 创建 JSON 对象的方法:使用 JSONObject 和 JSONArray对象。
- JSONObject (fastJson提供的json对象):我们可以把JSONObject 当成一个 Map<String,Object> ,源码如下:
public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler {
private static final long serialVersionUID = 1L;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
private final Map<String, Object> map;
- JSONArray(fastJson提供json数组对象):我们可以把 JSONArray 当做一个 List,其源码如下。因此, JSONArray 可以看成是 JSONObject 对象的一个集合。
public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable {
private static final long serialVersionUID = 1L;
private final List<Object> list;
protected transient Object relatedArray;
protected transient Type componentType;
- 示例
@Test
public void whenGenerateJson_thanGenerationCorrect() throws ParseException {
JSONArray jsonArray = new JSONArray(); // 创建JSONArray对象
for (int i = 0; i < 2; i++) {
JSONObject jsonObject = new JSONObject(); // 创建JSONObject对象
jsonObject.put("AGE", 10);
jsonObject.put("FULL NAME", "Doe " + i);
jsonObject.put("DATE OF BIRTH", "2016/12/12 12:12:12");
jsonArray.add(jsonObject);
}
String jsonOutput = jsonArray.toJSONString();
}
- 运行结果
[
{
"AGE":"10",
"DATE OF BIRTH":"2016/12/12 12:12:12",
"FULL NAME":"Doe 0"
},
{
"AGE":"10",
"DATE OF BIRTH":"2016/12/12 12:12:12",
"FULL NAME":"Doe 1"
}
]
三. @JSONField注解
1. @JSONField注解概述
- @JSONField的作用对象
(1)Field
(2)Setter和Getter 方法
2. @JSONField的配置方式
- 以下所有的注解属性都可以用在Field或setter和getter上。
1. name
:序列化对象的名称
- 配置在 getter/setter 上
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;}
}
- 配置在 field 上
public class A {
@JSONField(name="ID")
private int id;
public int getId() {return id;}
public void setId(int value) {this.id = id;}
}
2. ordinal
:指定字段的顺序
- 这个特性需要 1.1.42 以上版本。
public static class VO {
@JSONField(ordinal = 3)
private int f0;
@JSONField(ordinal = 2)
private int f1;
@JSONField(ordinal = 1)
private int f2;
}
3. format
:格式化 Date 属性
- 配置date序列化和反序列使用yyyyMMdd日期格式。
public class A {
// 配置date序列化和反序列使用yyyyMMdd日期格式
@JSONField(format="yyyyMMdd")
public Date date;
}
4. serialize/deserialize
:指定不序列化/反序列化的字段
- 默认情况下,所有属性都会序列化。
public class A {
@JSONField(serialize=false) //指定序列化操作时,不序列化的字段
public Date date;
}
public class A {
@JSONField(deserialize=false) //指定反序列化时,不反序列化的字段
public Date date;
}
- 如:指定字段不反序列化
@JSONField(name = "DATE OF BIRTH", deserialize=false)
private Date dateOfBirth;
- 输出结果
Person [age=20, fullName=John Doe, dateOfBirth=null]
5. 示例
@JSONField(name="AGE", serialize=false)
private int age;
@JSONField(name="LAST NAME", ordinal = 2)
private String lastName;
@JSONField(name="FIRST NAME", ordinal = 1)
private String firstName;
@JSONField(name="DATE OF BIRTH", format="dd/MM/yyyy", ordinal = 3)
private Date dateOfBirth;
- 输出结果为:
[
{
"FIRST NAME":"Doe",
"LAST NAME":"Jhon",
"DATE OF BIRTH":"19/07/2016"
},
{
"FIRST NAME":"Doe",
"LAST NAME":"Janette",
"DATE OF BIRTH":"19/07/2016"
}
]
四. 反序列化的其他情况
- 实体类
public class Person {
private int age;
private String fullName;
public Person(){}
public Person(int age, String fullName) {
super();
this.age = age;
this.fullName= fullName;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", fullName='" + fullName + '\'' +
'}';
}
//getter and setter
}
- 测试
public class StrToJsonTest {
public static void main(String[] args) {
// 正常
String jsonObject1 = "{\"age\":20,\"fullName\":\"sad\",}";
Person newPerson1 = JSON.parseObject(jsonObject1, Person.class);
System.out.println(newPerson1);
// 反序列化时,缺失的属性不会被反序列化
String jsonObject2 = "{\"age\":20}";
Person newPerson2 = JSON.parseObject(jsonObject2, Person.class);
System.out.println(newPerson2);
// 反序列化时,多余的属性不会被反序列化
String jsonObject3 = "{\"Age\":20,\"fullName\":\"sad\",\"dateOfBirth\":\"201888\"}";
Person newPerson3 = JSON.parseObject(jsonObject3, Person.class);
System.out.println(newPerson3);
}
- 运行结果
Person{age=20, fullName='sad'}
Person{age=20, fullName='null'}
Person{age=20, fullName='sad'}
参考资料
FastJson简明教程