JSONObject.fromObject 日期类型转换问题

今天在开发的时候遇到的问题:

由于需要调用rest服务,所以将dto对象转换为JSON的时候出现了日期格式不正确的问题:

首先查看接收的DTO:

JSONObject.fromObject 日期类型转换问题

由于接口需要以数组的方式传输:
JSONArray jsonArray = array.fromObject ( Arrays.asList ( esbDto ) );

在日志中查看转化之后的json:

[
  {
    "applyType": "INJURE",
    "address": "",
    "accountName": "XXX",
    "injuryType": "DISABILITY",
    "receiveOtherMoney": 0,
    "costAmount": 12333,
    "description": "开发测试",
    "bankName": "中行",
    "treatmentList": [
      
    ],
    "recordId": 1903011404540000,
    "fundingEmployeeCode": "3594",
    "phoneNumber": "13344444444",
    "createdBy": "3594",
    "fundingEmployeeName": "XXX",
    "happenDate": {
      "date": 5,
      "hours": 0,
      "seconds": 0,
      "month": 2,
      "timezoneOffset": -480,
      "year": 119,
      "minutes": 0,
      "time": 1551715200000,
      "day": 2
    },
    "selfpayingAmount": 12333,
    "appliedBy": "00003594",
    "familyLossAmount": 0,
    "applyDate": {
      "date": 1,
      "hours": 14,
      "seconds": 54,
      "month": 2,
      "timezoneOffset": -480,
      "year": 119,
      "minutes": 4,
      "time": 1551420294418,
      "day": 5
    },
    "relationship": "本人",
    "account": "513123124123123123",
    "familyMemberName": "XXX"
  }
]

可以很明显的看到两个日期对象不是我们想要的YYYY-MM-dd类型,

所以,很明显我们需要自己写一个转化器:

public class JsonDateValueProcessor implements JsonValueProcessor {
	@Override
	public Object processArrayValue(Object obj, JsonConfig jsonconfig) {
		return process(obj);
	}
	@Override
	public Object processObjectValue(String s, Object obj, JsonConfig jsonconfig) {
		return process(obj);
	}
	private Object process(Object obj) {
		if (obj == null) {// 如果时间为null,则返回空字串
			return "";
		}
		if (obj instanceof Date) {
			obj = new java.util.Date(((Date) obj).getTime());
		}
		if (obj instanceof java.util.Date) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",
					Locale.CHINA);// 格式化时间为yyyy-MM-dd类型
			return sdf.format(obj);
		} else {
			return new Object();
		}
	}
}

然后将其注册到jsonConfig中:

        //2.json 包装
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.registerJsonValueProcessor(Date.class,
				new JsonDateValueProcessor());// 注入处理Date类
		JSONArray jsonArray = array.fromObject ( Arrays.asList ( esbDto ),jsonConfig );

 

再来查看一下日志:

[
  {
    "applyType": "INJURE",
    "address": "",
    "accountName": "XXX",
    "injuryType": "DISABILITY",
    "receiveOtherMoney": 0,
    "costAmount": 12333,
    "description": "开发测试",
    "bankName": "中行",
    "treatmentList": [
      
    ],
    "recordId": 1903011413540000,
    "fundingEmployeeCode": "3594",
    "phoneNumber": "13344444444",
    "createdBy": "3594",
    "fundingEmployeeName": "XXX",
    "happenDate": "2019-03-05",
    "selfpayingAmount": 12333,
    "appliedBy": "00003594",
    "familyLossAmount": 0,
    "applyDate": "2019-03-01",
    "relationship": "本人",
    "account": "513123124123123123",
    "familyMemberName": "XXX"
  }
]

日期格式类型变成了我们想要的类型。

 

总结来说就是转换json的时候自己自定义一个日期处理类实现JsonValueProcessor接口,在实现类中进行自定义转化,

最后将其注入JsonConfig中,调用fromObject 时传入JsonConfig自定义对象即可。