fastjson(四)JSONField 和 JSONType 介紹
阿新 • • 發佈:2019-02-14
一、JSONField 介紹
注意:1、若屬性是私有的,必須有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;
}
二、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;}
}
三、使用format配置日期格式化
public class A {
// 配置date序列化和反序列使用yyyyMMdd日期格式
@JSONField(format="yyyyMMdd")
public Date date;
}
四、使用serialize/deserialize指定欄位不序列化
public class A {
@JSONField(serialize=false)
public Date date;
}
public class A {
@JSONField(deserialize=false)
public Date date;
}
五、使用ordinal指定欄位的順序
預設fastjson序列化一個java bean,是根據fieldName的字母序進行序列化的,你可以通過ordinal指定欄位的順序。這個特性需要1.1.42以上版本。
ordinal 預設值為 0
public static class VO {
@JSONField(ordinal = 3)
private int f0;
@JSONField(ordinal = 2)
private int f1;
@JSONField(ordinal = 1)
private int f2;
}
六、使用serializeUsing制定屬性的序列化類
在fastjson 1.2.16版本之後,JSONField支援新的定製化配置serializeUsing,可以單獨對某一個類的某個屬性定製序列化,比如:
public static class Model {
@JSONField(serializeUsing = ModelValueSerializer.class)
public int value;
}
public static class ModelValueSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
int features) throws IOException {
Integer value = (Integer) object;
String text = value + "元";
serializer.write(text);
}
}
測試程式碼:
Model model = new Model();
model.value = 100;
String json = JSON.toJSONString(model);
Assert.assertEquals("{\"value\":\"100元\"}", json);
JSONType和JSONField類似,但JSONType配置在類上,而不是field或者getter/setter方法上。這裡就不再介紹了。
下面來看一下具體的程式碼示例:
User 類:
只對id屬性自定義序列化。
package json.fastjson.JSONField;
import java.util.Date;
import com.alibaba.fastjson.annotation.JSONField;
public class User {
@JSONField(name = "ID", ordinal = 3, serializeUsing = UserIDValueSerializer.class)
private Long id;
@JSONField(serialize = false)
private String name;
@JSONField(serialize = true, ordinal = 2)
private String sex;
@JSONField(deserialize = false)
private String address;
@JSONField(deserialize = true)
private String phone;
// 配置date序列化和反序列使用yyyyMMdd日期格式
@JSONField(format = "yyyyMMdd", ordinal = 1)
private Date date;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
UserIDValueSerializer 類:
package json.fastjson.JSONField;
import java.io.IOException;
import java.lang.reflect.Type;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
public class UserIDValueSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
//serializer:{"address":"杭州","phone":"18603396966","date":"20180125","sex":"男","ID":
//object:100
//fieldName:ID
//fieldType:class java.lang.Long
//features:0
Long value = (Long) object;
String text = value + "元";
serializer.write(text);
}
}
測試類:
package json.fastjson.JSONField;
import java.util.Date;
import com.alibaba.fastjson.JSON;
public class TestJSONField {
public static void main(String[] args) {
User user = new User();
user.setId(100L);
user.setName("WaKengMaiNi");
user.setSex("男");
user.setAddress("杭州");
user.setPhone("18603396966");
user.setDate(new Date());
// User序列化
String jsonString = JSON.toJSONString(user);
System.out.println("User序列化:" + jsonString);
}
}
輸出結果:
User序列化:{"address":"杭州","phone":"18603396966","date":"20180125","sex":"男","ID":"100元"}