FastJSON將Java物件轉為json,日期顯示時間戳未格式化解決辦法
阿新 • • 發佈:2020-01-11
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;
}