Gson时间去除

Tom*_*mek 4 java android json gson deserialization

我有一个JSON字符串,我想使用Gson deserilizie - {"Id":3,"Title":"Roskilde","Description":"Famous Danske festival","StartingTime":"2016-06-12T00:00:00","Duration":"02:02:00"} 当我尝试deserilize持续时间字段时我得到的错误:

无法解释的日期:"02:02:00"

deserilizer(我的想法是添加两种可能的日期反序列化格式):

Gson gSon=  new GsonBuilder().registerTypeAdapter(Date.class, new DateDeserializer()).create();


private static final String[] DATE_FORMATS = new String[] {
        "yyyy-MM-dd'T'HH:mm:ss",
        "HH:mm:ss"
};


private class DateDeserializer implements JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonElement jsonElement, Type typeOF,
                            JsonDeserializationContext context) throws JsonParseException {
        for (String format : DATE_FORMATS) {
            try {
                return new SimpleDateFormat(format, Locale.US).parse(jsonElement.getAsString());
            } catch (ParseException e) {
            }
        }
        throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString()
                + "\". Supported formats: " + Arrays.toString(DATE_FORMATS));
    }
}
Run Code Online (Sandbox Code Playgroud)

和我的事件类(你可以看到"持续时间"不属于类型日期 - 它的类型是时间 - 我该怎样做才能使deserilizer读取持续时间作为类型时间而不是日期?

    private int Id;
private String Title;
private String Description;
private Date StartingTime;
private Time Duration;
public Event(int id, String title,String description, String place, Date startingTime, Time duration)
{
    this.Id = id;
    this.Description = description;
    this.Title = title;
    this.StartingTime = startingTime;
    this.Duration = duration;
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*Gun 7

为时间反序列化添加另一个类 - 确保将返回值转换为"时间".(另见:将一个String转换为sql时间)

    private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
    private static final String TIME_FORMAT = "HH:mm:ss";

    private class DateDeserializer implements JsonDeserializer<Date> {

        @Override
        public Date deserialize(JsonElement jsonElement, Type typeOF,
                                JsonDeserializationContext context) throws JsonParseException {
                try {
                    return new SimpleDateFormat(DATE_FORMAT, Locale.US).parse(jsonElement.getAsString());
                } catch (ParseException e) {
                }

            throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString()
                    + "\". Supported formats: " + DATE_FORMAT);
        }
    }

    private class TimeDeserializer implements JsonDeserializer<Time> {

        @Override
        public Time deserialize(JsonElement jsonElement, Type typeOF,
                                JsonDeserializationContext context) throws JsonParseException {
                try {

                    String s = jsonElement.getAsString();
                    SimpleDateFormat sdf = new SimpleDateFormat(TIME_FORMAT, Locale.US);
                    sdf.parse(s);
                    long ms = sdf.parse(s).getTime();
                    Time t = new Time(ms);
                    return t;
                } catch (ParseException e) {
                }
            throw new JsonParseException("Unparseable time: \"" + jsonElement.getAsString()
                    + "\". Supported formats: " + TIME_FORMAT);
        }
    }
Run Code Online (Sandbox Code Playgroud)

注册两个类:

    GsonBuilder gSonBuilder=  new GsonBuilder();
    gSonBuilder.registerTypeAdapter(Date.class, new DateDeserializer());
    gSonBuilder.registerTypeAdapter(Time.class, new TimeDeserializer());
    Gson gSon = gSonBuilder.create();
Run Code Online (Sandbox Code Playgroud)