自定义fastjson反序列化

fastjson自定义反序列化实现类,demo对一个字符串进行日期格式化(可兼容多重格式)、String转Double和String转Integer。

1.自定义fastjson字符串日期格式化

自定义类DateCompatibilityFormat,继承ObjectDeserializer,如下:
	/**
	 * fastjson custom class
	 * chenyouhong
	 * date format
	 */
	@Slf4j
	public class DateCompatibilityFormat implements ObjectDeserializer {


		//格式化样式
	    private static final List<String> formatStyles = Lists.newArrayList("yyyy.MM.dd", "yyyy.MM", "yyyy.MM.dd hh:mm:ss");

	    //关键代码
	    @Override
	    public Date deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
	        DateTime dateTime = null;
	        try {
	            for (String formatStyle: formatStyles) {
	                dateTime = this.getDateTime(formatStyle, parser.getLexer().stringVal());
	                if (dateTime != null) break;
	            }
	        } catch (Exception e) {
	            log.info("error {}", e);
	        }

	        return dateTime != null ? dateTime.toDate() : null;
	    }

	    //日期格式化
	    private DateTime getDateTime(String sFormat, String sDate) {
	        DateTime dateTime = null;
	        try {
	            dateTime = DateTimeFormat.forPattern(sFormat).parseDateTime(sDate);
	        } catch (Exception e) {
	            log.info("date format error, format={}, date={}, error={}", sFormat, sDate, e);
	        }

	        return dateTime;
	    }

	    //暂未知道具体作用
	    @Override
	    public int getFastMatchToken() {
	        return 0;
	    }

	}

2.对应Model加上相应的注解即可


	@Data
	public class SysUser implements Serializable {

	    private static final long serialVersionUID = 1L;

	    private String username;

	    private String loginCode;

	    private String password;

	    //日期格式化
	    @JSONField(deserializeUsing = DateCompatibilityFormat.class)
	    private Date createDate;

	    private String mobile;

		//String转Integer
	    @JSONField(deserializeUsing = StringToIntegerFormat.class)
	    private Integer age;

		//String转Double
	    @JSONField(deserializeUsing = StringToDoubleFormat.class)
	    private Double weight;

	}

3.测试方法

	@Test
	public void testFormat() {
		String json = " {\"createDate\":\"2015.03\", \"age\":\"20,189.89\"}";
		SysUser sysUser = JSON.parseObject(json, SysUser.class);

        try {

            DateTime dateTime = new DateTime(sysUser.getCreateDate());
            String s = dateTime.toString("yyyy-MM-dd");
            System.out.println(s);
            s = dateTime.toString("yyyy-MM");
            System.out.println(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(JSON.toJSONString(sysUser));

	}

demo链接:https://github.com/13162576590/fastjson_demo

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值