使用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很不错的延伸。

posted @ 2017-05-05 10:15  lupeng2010  阅读(22132)  评论(0编辑  收藏  举报