java-fastjson怎样使用自定义DateFormatDeserializer

如题所述

第1个回答  2016-08-21
反序列化问题
如何使用fastjson成功反序列如下json串?
{“id”:1,”status”:200}
显然,如果直接用Json.parseObject()方法进行反序列化,会报如下错误信息:
Exception in thread “main” com.alibaba.fastjson.JSONException: parse
enum com.netwaymedia.exhibition.nio.common.dto.Msg$StatusCodeEnum
error, value : 200 at
com.alibaba.fastjson.parser.deserializer.EnumDeserializer.deserialze(EnumDeserializer.java:48)
at
com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:33)
原因分析:前面已经提过,fastjson默认使用ordinal值去查找对应的枚举实例,显示是获取不到的,所以抛出异常,需要修改status值为0才运行OK。
序列化问题
如果使用JSON.toJSONString()方法对上述Msg对象进行序列化,会得到如下json串
{“id”:1,”status”:”OK”}
显示不是我们所期待的原始字符串
{“id”:1,”status”:200}
如何解决上述两大问题?
优雅的解决方案
答案就在于fastjson提供注解JSONField。通过JSONField可灵活控制字段的序列化和反序列,重新修改Msg结构如下:
public class Msg {

private int id;

private StatusCodeEnum statusCode;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

@JSONField(name = "status")
public int getStatus() {
return statusCode.getCode();
}

@JSONField(name = "status")
public void setStatus(int code) {
this.statusCode = StatusCodeEnum.getEnum(code);
}

@JSONField(serialize = false)
public StatusCodeEnum getStatusCode() {
return statusCode;
}

@JSONField(deserialize = false)
public void setStatusCode(StatusCodeEnum statusCode) {
this.statusCode = statusCode;
}

public static enum StatusCodeEnum {
OK(200, "正常"), BAD_REQUEST(400, "服务器出错");

private static final Map<Integer, StatusCodeEnum> CODE_MAP = new HashMap<Integer, StatusCodeEnum>();

static {
for (StatusCodeEnum typeEnum : StatusCodeEnum.values()) {
CODE_MAP.put(typeEnum.getCode(), typeEnum);
}
}

StatusCodeEnum(int code, String meaning) {
this.code = code;
this.meaning = meaning;
}

public int getCode() {
return code;
}

public String getMeaning() {
return meaning;
}

public static StatusCodeEnum getEnum(Integer code) {
return CODE_MAP.get(code);
}

private final int code;
private final String meaning;
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

思路是通过修改字段名为statusCode,并用JSONField注解该字段不进行序列和反序列化,但是提供getStatus/setStatus方法来定制化枚举变量statusCode的序列和反序列,完美的解决前面提到的两大问题。
这个方法我在网上还没看到过,是我自己尝试出来的,特别拿出来跟大家分享,不用谢,请叫我雷锋。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网