JSON版本:FastJson
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
}
可以使用 JSON.toJSONString() 将 Java 對象轉換換為 JSON 對象:
private List<Person> listOfPersons = new ArrayList<Person>();
@Before
public void setUp() {
listOfPersons.add(new Person(15, "John Doe", new Date()));
listOfPersons.add(new Person(20, "Janette Doe", new Date()));
}
@Test
public void whenJavaList_thanConvertToJsonCorrect() {
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"
}
]
我們還可以自定義輸出,并控制字段的排序,日期顯示格式,序列化标記等。
接下來我們更新 bean 并添加幾個字段:
@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;
以上代碼中我們列出了基本參數類别,并使用 @JSONField 注解,以便實作自定義轉換:
- *format* 參數用于格式化 date 屬性。
- 預設情況下, FastJson 庫可以序列化 Java bean 實體, 但我們可以使用 *serialize* 指定字段不序列化。
- 使用 *ordinal* 參數指定字段的順序
這樣,以上輸出結果為:
[
{
"FIRST NAME":"Doe",
"LAST NAME":"Jhon",
"DATE OF BIRTH":"19/07/2016"
},
{
"FIRST NAME":"Doe",
"LAST NAME":"Janette",
"DATE OF BIRTH":"19/07/2016"
}
]
@JSONField
@JSONField 的作用對象:
- Field
- Setter 和 Getter 方法
注意:FastJson 在進行操作時,是根據 getter 和 setter 的方法進行的,并不是依據 Field 進行。
注意:若屬性是私有的,必須有 set 方法。否則無法反序列化。
package com.alibaba.fastjson.annotation;
public @interface JSONField {
// 配置序列化和反序列化的順序,1.1.42版本之後才支援
int ordinal() default 0;
// 指定字段的名稱
String name() default "";
// 指定字段的格式,對日期格式有用
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}
2. JSONField 配置方式
FieldInfo 可以配置在 getter/setter 方法或者字段上。例如:
2.1 配置在 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;}
}
2.2 配置在 field 上
public class A {
@JSONField(name="ID")
private int id;
public int getId() {return id;}
public void setId(int value) {this.id = id;}
}
3. 使用format配置日期格式化
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;
}
5. 使用 ordinal 指定字段的順序
預設 fastjson 序列化一個 java bean,是根據 fieldName 的字母序進行序列化的,你可以通過 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;
}