4

我正在使用 FlexJSON,并且无法Dateint. 我正在尝试像这样使用 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 无法处理保存为 1969 年 12 月 7 日至 1970 年 1 月 25 日范围内的 Unix TimeStamp 的日期。该范围之外的任何其他日期都被接受并且也是一个 Unix 时间戳。

我认为我不需要使用.use()或创建自定义 Transformer 来实现自定义 ObjectFactory,因为其他 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]
4

2 回答 2

3

我遇到了同样的问题。通过扩展 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 字符串。

于 2013-01-25T15:10:03.840 回答
1

好吧,这绝对是 Flexjson 的问题。我们仍然无法找出问题所在,但我的同事设法想出了一个解决方法,直到它得到解决。本质上,我们创建一个新DateTransformer格式并指定要使用的格式。然后,我们使用该转换器来转换Date.class序列化时的序列化,并在反序列化时再次使用转换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);
于 2012-12-12T19:47:22.307 回答