net.sf.json.JSONObject对时间戳的格式化处理

1.问题

应用A向应用B发起HTTP请求获取数据,数据中包含日期格式的属性Time。应用B在返回数据给应用A之前对日期Time进行了格式化,转换成了时间戳。假设Time格式化前为‘2020-11-08 00:22:35’,对应的时间戳为‘1468905’。发现应用A接收到数据后Time的值确实是‘1468905’,然而应用A在对数据进行格式化后发现Time却不是‘2020-11-08 00:22:35‘,而是服务器当前时间!

2.排查

首先确定了日期转换为时间戳没有错误,问题出在了格式化工具上——net.sf.json.JSONObject。

通过Debug发现,应用A对接收到的数据进行格式化的时候,对于属性Time接收到的类型是Long,而期望的类型是Date。实际类型与期望类型不符合,判断为真:

if (!targetType.isInstance(value)) {
setProperty(bean, key, morphPropertyValue(key, value, type, targetType), jsonConfig);
}

在morphPropertyValue方法中意图利用反射从Long类型的Class中找到date属性,然后将时间戳赋给date......

//sourceBean:就是Long类型的时间戳
//name:意图寻找到date属性
PropertyDescriptor sourcePd = PropertyUtils.getPropertyDescriptor(sourceBean, name);

结果可想而知,它死活找不到。最后返回服务器当前时间......

3.解决

不去拷贝屎前代码;

用FastJSON。

原文地址:https://www.cnblogs.com/monument/p/13944882.html