使用FASTJSON做反序列化的时间格式处理

JSONObject.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.mmm";
Productorder tmp1 = JSONObject.parseObject(tmp.toJSONString(), Productorder.class);

 

  • 方案2:新增date反序列化解析器

主要思路是以fastjson原生的DateDeserializer.class为基础,定制化一个可以解析0000-00-00日期反序列化解析器。
该方式是fastjson函数JSON.parseObject()的一个应用场景,通过定制化ParserConfig参数,达到局部改变JSON解析逻辑的目的。
如下:

package jeromechan.fixbug.fastjson; import com.alibaba.fastjson.parser.DefaultJSONParser; import com.alibaba.fastjson.parser.deserializer.DateDeserializer; import java.lang.reflect.Type; /** * Copyright �0�8 2016 Jerome Chan. All rights reserved. * An extended DateDeseializer for parsing '0000-00-00'. * * @author chenjinlong * @CreateDate 7/20/16 5:55 PM */ public class JCDateDeserializer extends DateDeserializer { public static final JCDateDeserializer instance = new JCDateDeserializer(); public JCDateDeserializer() { } protected <T> T cast(DefaultJSONParser parser, Type clazz, Object fieldName, Object val) { if (val == null) { return null; } else if (val instanceof String) { String strVal = (String) val; if (strVal.length() == 0) { return null; } else if (strVal.equals("0000-00-00")) { parser.setDateFormat("yyyy-MM-dd"); } } return super.cast(parser, clazz, fieldName, val); } } 
// 示例执行例子
public class TestDemo { public static String jsonStr = "{\"dateStr\":\"0000-00-00\"}"; public static void main(String[] args) { ParserConfig jcParserConfig = new ParserConfig(); jcParserConfig.putDeserializer(Date.class, JCDateDeserializer.instance); DateBeanDemo resultObject = JSON.parseObject(TestDemo.jsonStr, DateBeanDemo.class, jcParserConfig, JSON.DEFAULT_PARSER_FEATURE); } } 

假设觉得这种解析办法可以作为整个项目内的全局特性,感兴趣的话可以将定制好的JCDateDeserializer利用spring框架注入到项目容器中。这同样是对于方案2很不错的延伸。

转载于:https://www.cnblogs.com/lupeng2010/p/6811576.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fastjson可以自动识别多种日期格式进行序列。其中包括ISO-8601日期格式(例如yyyy-MM-dd、yyyy-MM-dd HH:mm:ss、yyyy-MM-dd HH:mm:ss.SSS)、毫秒数字、毫秒数字字符串以及.NET JSON日期格式(例如new Date(1982932381111))。[1] 在使用Fastjson进行序列时,可以通过设置SerializerFeature.UseISO8601DateFormat来将日期序列为ISO-8601日期格式。例如,可以使用以下代码将日期序列为ISO-8601日期格式: ``` Ao ao = new Ao(); ao.setId(1); ao.setDate(new Date()); Ao aos1 = JSON.parseObject(JSON.toJSONString(ao, SerializerFeature.UseISO8601DateFormat), Ao.class); ``` [2] 除了使用SerializerFeature.UseISO8601DateFormat,还可以使用其他方法来指定日期的序列格式。例如,可以使用JSON.toJSONStringWithDateFormat方法来指定日期的格式: ``` Ao ao = new Ao(); ao.setId(1); ao.setDate(new Date()); String json = JSON.toJSONStringWithDateFormat(ao, "yyyy-MM-dd HH:mm:ss.SSS"); ``` [3] 另外,还可以通过修改全局的日期格式来设置默认的日期格式。例如,可以使用以下代码将全局的日期格式修改为"yyyy-MM-dd": ``` JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd"; ``` 然后,可以使用SerializerFeature.WriteDateUseDateFormat来使用默认的全局日期格式进行序列: ``` Ao ao = new Ao(); ao.setId(1); ao.setDate(new Date()); String json = JSON.toJSONString(ao, SerializerFeature.WriteDateUseDateFormat); ``` 总之,Fastjson提供了多种方式来序列时间格式,包括自动识别多种日期格式、指定日期格式以及修改全局的日期格式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值