This repository has been archived by the owner on Oct 23, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6.5k
enum_custom_serialization
温绍锦 edited this page Jun 14, 2020
·
7 revisions
fastjson支持在某些业务场景下,将Enum类型作为JavaBean序列化输出。
public static class Model {
public int id;
public OrderType orderType;
}
public static enum OrderType implements JSONSerializable {
PayOrder(1, "支付订单"), //
SettleBill(2, "结算单");
public final int value;
public final String remark;
private OrderType(int value, String remark){
this.value = value;
this.remark = remark;
}
@Override
public void write(JSONSerializer serializer, Object fieldName, Type fieldType,
int features) throws IOException {
JSONObject json = new JSONObject();
json.put("value", value);
json.put("remark", remark);
serializer.write(json);
}
}
Model model = new Model();
model.id = 1001;
model.orderType = OrderType.PayOrder;
String text = JSON.toJSONString(model);
Assert.assertEquals("{\"id\":1001,\"orderType\":{\"remark\":\"支付订单\",\"value\":1}}", text);
使用@JSONType配置Enum当做JavaBean序列化,需要1.2.24之后的版本
@JSONType(serializeEnumAsJavaBean = true)
public static enum OrderType {
PayOrder(1, "支付订单"), //
SettleBill(2, "结算单");
public final int value;
public final String remark;
private OrderType(int value, String remark) {
this.value = value;
this.remark = remark;
}
}
直接修改SerializeConfig配置Enum当做JavaBean序列化,需要1.2.24之后的版本,这个方法的好处是不需要修改Enum类的代码
SerializeConfig.globalInstance.configEnumAsJavaBean(OrderType.class);
在fastjson 1.2.71版本之后,支持配置JSONField或者MixIn的方法做定制序列化和反序列化
public void test_for_issue() throws Exception {
VO vo = new VO();
vo.type = Color.Black;
String str = JSON.toJSONString(vo);
assertEquals("{\"type\":1003}", str);
VO vo2 = JSON.parseObject(str, VO.class);
}
public static class VO {
public Color type;
}
public enum Color {
Red(1001),
White(1002),
Black(1003),
Blue(1004);
private final int code;
private Color(int code) {
this.code = code;
}
@JSONField
public int getCode() {
return code;
}
@JSONCreator
public static Color from(int code) {
for (Color v : values()) {
if (v.code == code) {
return v;
}
}
throw new IllegalArgumentException("code " + code);
}
}
在fastjson 1.2.71版本之后,支持配置JSONField或者MixIn的方法做定制序列化和反序列化
public void test_for_issue() throws Exception {
JSON.addMixInAnnotations(Color.class, ColorMixedIn.class);
VO vo = new VO();
vo.type = Color.Black;
String str = JSON.toJSONString(vo);
assertEquals("{\"type\":1003}", str);
VO vo2 = JSON.parseObject(str, VO.class);
}
public static class VO {
public Color type;
}
public enum Color {
Red(1001),
White(1002),
Black(1003),
Blue(1004);
private final int code;
private Color(int code) {
this.code = code;
}
public int getCode() {
return code;
}
public static Color from(int code) {
for (Color v : values()) {
if (v.code == code) {
return v;
}
}
throw new IllegalArgumentException("code " + code);
}
}
public static class ColorMixedIn {
@JSONField
public int getCode() {
return 0;
}
@JSONCreator
public static Color from(int code) {
return null;
}
}
如有需要修改本注脚,请联系阿里巴巴,
© Alibaba Fastjson Develop Team
注明: 版权所有阿里巴巴,请注明版权所有者
If you need to amend this footnote, please contact Alibaba.
© Alibaba Fastjson Develop Team
Note: Copyright Alibaba, please indicate the copyright owner