5

Spring 構成の REST サーバーでは、Jackson を使用してオブジェクトを Json に変換します。このオブジェクトには、いくつかの java.util.Date オブジェクトが含まれています。

Gson の fromJson メソッドを使用して Android デバイスでデシリアライズしようとすると、「java.text.ParseException: Unparseable date」が発生します。1970 年以降のミリ秒に対応するタイムスタンプに日付をシリアル化しようとしましたが、同じ例外が発生します。

1291158000000 などのタイムスタンプ形式の日付を java.util.Date オブジェクトに解析するように Gson を構成できますか?

4

2 に答える 2

7

Dates 用に独自のデシリアライザーを登録する必要があります。

以下に、JSON 文字列 "23-11-2010 10:00:00" が Date オブジェクトに逆シリアル化される小さな例を作成しました。

import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;


public class Dummy {
    private Date date;

    /**
     * @param date the date to set
     */
    public void setDate(Date date) {
        this.date = date;
    }

    /**
     * @return the date
     */
    public Date getDate() {
        return date;
    }

    public static void main(String[] args) {
        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {

            @Override
            public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
                    throws JsonParseException {

                SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
                String date = json.getAsJsonPrimitive().getAsString();
                try {
                    return format.parse(date);
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        Gson gson = builder.create();
        String s = "{\"date\":\"23-11-2010 10:00:00\"}";
        Dummy d = gson.fromJson(s, Dummy.class);
        System.out.println(d.getDate());
    }
}
于 2010-12-01T10:07:43.140 に答える
1

Jackson に関しては、数値 (タイムスタンプ) とテキストのシリアル化 (SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS) を選択できるだけでなく、テキストのバリアント (SerializationConfig.setDateFormat) に使用する正確な DateFormat を定義することもできます。したがって、ジャクソンがデフォルトで使用するISO-8601形式をサポートしていない場合、Gsonが認識するものを強制的に使用できるはずです。

また、ジャクソンは、Gson で使用することを気にしない場合、Android でも問題なく動作します。

于 2010-12-03T17:13:25.790 に答える