繁体   English   中英

FlexJSON无法反序列化日期

[英]FlexJSON failing to deserialize Date

我正在使用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 TimeStamp的日期,这些日期在1969年12月7日到1970年1月25日的范围内。该范围之外的任何其他日期都被接受,也是Unix TimeStamp。

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



更新#2


我尝试在序列化时实现一个transformer ,使用以下命令将日期从Unix TimeStamp更改为日期格式化字符串:

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);
}

在那之后只是做小技巧

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

然后你可以轻松地反序列化json字符串。

嗯,这绝对是Flexjson的一个问题。 我们仍然无法弄清楚问题,但我的同事设法解决了问题,直到问题得到解决。 基本上我们创建一个新的DateTransformer并指定要使用的格式。 然后我们使用该变换器在序列化时转换Date.class ,并在反序列化时再次use()变换器use()

DateTransformer

private static final DateTransformer DATE_TRANSFORMER = new DateTransformer("MM/dd/yyyy");

连载:

String json = new JSONSerializer().transform(DATE_TRANSFORMER, Date.class).serialize(personalInformation);

反序列化:

return new JSONDeserializer<PersonalInformation>().use(Date.class, DATE_TRANSFORMER).deserialize(json);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM