json - FlexJSON 无法反序列化日期

标签 json playframework playframework-2.0 deserialization flexjson

我正在使用 FlexJSON,但在从 int 解析 Date 对象时遇到问题。我正在尝试像这样使用 JSONDeserializer:

String json = decryptJson(new String(personalInformationData));
return new JSONDeserializer<PersonalInformation>().deserialize(json);

json的值为:

{"address1":"123 Fake St","address2":"#4","address3":"","city":"Springfield","class":"PersonalInformation","confirmEmailAddress":"foo@bar.com","coverageGroupName":"","coverageGroupNumber":"","coverageType":"I","dob":21600000,"emailAddress":"foo@bar.com","firstName":"Zapp","formOfId":"D","group":false,"idNum":"K201132083220","idState":"AL","individual":true,"lastName":"Brannigan","middleInitial":"","nonUsAddress":false,"nonUsAddress1":null,"nonUsAddress2":null,"nonUsAddress3":null,"phone":"(555) 555-5555","ssn":"555555555","state":"OH","zip":"55555"}

除非出生日期(dob 键)值在 1969 年 12 月 7 日到 1970 年 1 月 25 日之间(或 -2138400000 到 2095200000 以毫秒为单位),否则一切都会正确解析,然后 FlexJSON 会抛出此错误:

[JSONException: [ dob ]: Parsing date 21600000 was not recognized as a date format]

我不确定这是如何发生的,因为 new Date(21600000) 的计算结果为 Thu Jan 01 00:00:00 CST 1970

有人遇到过这种情况吗?


<小时/>

更新#1

<小时/>

因此,发生此错误的原因似乎是 JSONDeserializer 无法处理保存为 Unix 时间戳的日期,这些日期在 1969 年 12 月 7 日到 1970 年 1 月 25 日的范围内。接受该范围之外的任何其他日期也是一个 Unix 时间戳。

我认为我不需要使用 .use() 实现自定义 ObjectFactory 或创建自定义 Transformer,因为其他 Unix 时间戳可以在不在失败日期范围内的情况下工作。


<小时/>

更新#2

<小时/>

我尝试在序列化时实现一个转换器,以使用以下方法将日期从 Unix 时间戳更改为日期格式的字符串:

String json = new JSONSerializer().transform(new DateTransformer("yyyy-caMM-dd"), "dob").serialize(personalInformation);

这完全按照预期的方式工作,但在反序列化时却不起作用。我仍然遇到同样的错误:

[JSONException: [ dob ]: Parsing date 1970-01-01 was not recognized as a date format]

最佳答案

我也遇到了同样的问题。通过扩展 flexjson.factories.DateObjectFactory 并重写 instantiate() 方法来修复,就像这样。

@Override
public Object instantiate(ObjectBinder context, Object value, Type targetType, Class targetClass) {

    if (value instanceof Integer) {
        return super.instantiate(context, ((Integer) value).longValue(), targetType, targetClass);
    }
    return super.instantiate(context, value, targetType, targetClass);
}

然后做一些小 Action

JSONDeserializer<T> jsonDeserializer = new JSONDeserializer<T>().use(Date.class, new >YourExtendedDateObjectFactoryClass<)

然后就可以轻松反序列化json字符串了。

关于json - FlexJSON 无法反序列化日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13810413/

相关文章:

javascript - 基于另一个 JSON 格式的 JavaScript 对象更新

playframework - 类型 ""不是包 Controller Play Framework 的成员

java - [Gradle][Play]compilePlayBinaryScala 定义在哪里?

scala - 在 Play2 Scala 中使用 reactivemongo 显示来自 MongoDB 的图像

android - 如何使用 Google Maps API 追踪路径,就像运行应用程序一样?

java - Spring RestTemplate 解析具有可变键名的 JSON 对象

python - 如何在 Dataflow/Beam 的 gcs 中将结果写入 JSON 文件

playframework - 通过在 Play Framework 中保存 BigDecimal 失去精度

java-8 - 为什么 Play 2.5 Akka block 响应一次全部加载

java - 尝试下载远程图像时出现 403