4

FlexJSON を使用していDateますが、int. 私は 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 タイムスタンプとして保存された日付を処理できないため、このエラーが発生しているようです。その範囲外の他の日付も受け入れられ、 Unix タイムスタンプ。

.use()失敗した日付範囲にない他の Unix タイムスタンプが機能するため、カスタム Transformer を使用してカスタム ObjectFactory を実装したり、カスタム Transformer を作成したりする必要はないと思います。



アップデート #2


transformer次を使用して、シリアル化時に日付を 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]
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 に答える