java-fastjson怎样使用自定义dateformatdeserializer

author author     2023-03-12     231

关键词:

参考技术A 反序列化问题
如何使用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的序列和反序列,完美的解决前面提到的两大问题。
这个方法我在网上还没看到过,是我自己尝试出来的,特别拿出来跟大家分享,不用谢,请叫我雷锋。

怎样在appcompatactivity当中使用自定义toolbar

参考技术A仔细看了msdn网站,微软说的很清楚,当按钮变化时候有消息发送出来,你自己响应消息进行处理。因为按钮状态要store的。 查看详情

学会怎样使用jsp内置标签jstl标签库及自定义标签

 jsp标签的分类:  1)内置标签(动作标签):不需要在jsp页面导入标签  2)jstl标签:需要在jsp页面中导入标签  3)自定义标签:开发者自行定义,需要在jsp页面导入标签  1、内置标签(动作标签): &nbs... 查看详情

在eclipse中怎样使用import导入自定义包

参考技术A1.打开elipse。2.点击第一栏的文件3.选择import或导入4.选择你要导入的包所在文件夹。5.点击下一步6.在选择你要导入的包。7.点击完成 查看详情

在fastreport中怎样使用自定义的纸张大小

1、切换到“页面布局”,点击“纸张大斜。2、在“纸张大斜下拉选项中,选择“其他页面大斜。3、弹出页面设置对话框,切换到“纸张”,在纸张大小下拉列表中,选择“自定义大斜。4、然后在“宽度”和“高度”中,输入... 查看详情

怎样自定义一个异常(报错)并抛出(代码片段)

1.自定义一个异常需要使用构造函数Error()varerror1=newError("Thisisanunknownerror."); 2.抛出异常需要使用throw关键字varerror1=newError("Thisisanunknownerror.");throwerror1; 执行后就可以得到这样的效果:   查看详情

fullpage.js的easing参数怎样配置自定义动画

首先看非官方文档并没有详细的说明怎样去使用easing.js,所以我加的运动属性根本就不起作用,再看,官方文档Optionally,whenusingcss3:false,youcanaddthejQueryUIlibraryincaseyouwanttouseothereasingeffectsapartfromtheonesincludedinthejQuerylibrary(linearan 查看详情

在delphi中如何使用sql自定义函数,参数怎样传递给自定义函数?

1如不雅是直接应用萌芽语句就用adoquery,直接adoquery.sql.txt:='yourproctxt'或sql.add()也可以,可以直接在yourtxt琅绫擎给参数赋值,然后open就履行啦如不雅是调用sqlserver中的存储过程,那么应用adostoredproc控件就行,先设置procedure... 查看详情

我已经在我的自定义 UITableViewCell 类中覆盖了 setHighlight。但是,我并不总是想使用它。我怎样才能防止它被使用?

...ell类中覆盖了setHighlight。但是,我并不总是想使用它。我怎样才能防止它被使用?【英文标题】:I\'veoverrodesetHighlightinmycustomUITableViewCellclass.However,Idon\'talwayswanttouseit.HowcanIpreventfromitbeingused?【发布时间】:2015-06-2903:41:32【 查看详情

java中excel转换成xml,怎样自定义excel的列为属性,或者值

是用户在页面上自定义哦参考技术A可以使用HSSFWorkbook,这个是用来解析excel的,能够取到每一行和列,之前有写过这方面的解析,如有需要,我可以给你一个实例..追问是用户在页面上自定义哦追答使用HSSFWorkbook,,读出数据后,... 查看详情

在eclipse中怎样使用import导入自定义包

我在package1包中建立了ShowHello.java,想在package2中调用,这是代码packagepachage1;classHellopublicvoidshowhello()System.out.println("HelloJava");publicclassShowHellopublicstaticvoidmain(String[]args)Hellop=newHello();p.showhello();package2;importimportpackage1.ShowHello;p... 查看详情

jparepository怎样自定义查询

参考技术A1、使用@Query自定义查询(SpringData提供的)这种查询可以声明在Repository方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Springdata的特有实现。例如:publicinterfaceUserRepositor... 查看详情

springsecurity3.0怎样自定义登录,后台自定义参数传递

参考技术A啥意思?没明白,问题描述的太模糊。你就说你要实现什么样的效果吧本回答被提问者采纳 查看详情

使用 Vision API 的自定义 RectangleDetector

...tor和BarcodeDetector?我需要从相机框架中检测矩形形状。我怎样才能做到这一点?【问题讨论】:你实现了 查看详情

怎样自定义openwrt登陆界面

参考技术A在编译的时候将你的配置文件放到制定位置就好了。你的情况是要自定义LuCi,那你就去buildroot/packages/luci里面,修改里面的代码就好 查看详情

怎样更改jquerymobile的样式

参考技术A以下的默认配置可以通过$.mobile对象重新配置自定义命名空间s(字符,默认:""):在jQueryMobile中,甚至可以自定义象HTML5中的data-attribute等系列属性,比如data-role等。这通过自定义命名空间即可实现。比如可以实现自... 查看详情

java-fastjson中jsonobject的顺序问题(代码片段)

目录1. JSONObject 存在的默认排序问题一1.1.解决方案一1.2.解决方案二2. JSONObject 存在的默认排序问题二2.1.解决方案一2.2.解决方案二在使用fastjson中的JSONObject有时候会遇到数据顺序发生了变化,而实际需求中需要保持原有的... 查看详情

如何自定义创建用户向导

...010,似乎我只能使用基本表单或创建一个全新的表单。我怎样才能以基本形式存在的所有内容并简单地添加更 查看详情

jsp中怎样引入自定义的java类?

<%@pageimport="com.POIExcelReader"%>POIExcelReadera=newPOIExcelReader();报错java.lang.ClassNotFoundExceptionJAVA引入自定义的类,可以使用关键字import。import关键字的作用就是加载外部的java类,后跟:包名+类名,需要写在类的最上面,后面... 查看详情