Java Gson时间反序列化

Java Gson时间反序列化,java,android,json,gson,deserialization,Java,Android,Json,Gson,Deserialization,我有一个JSON字符串,我想使用Gson进行反序列化—{“Id”:3,“Title”:“Roskilde”,“Description”:“著名的丹麦节日”,“StartingTime”:“2016-06-12T00:00:00”,“Duration”:“02:02:00”} 尝试反序列化持续时间字段时出现的错误: 无法解析的日期:“02:02:00” 反序列化程序(我的想法是添加两种可能的日期反序列化格式): 您应该为日期和时间注册反序列化程序。大概是这样的: try{ // Conve

我有一个JSON字符串,我想使用Gson进行反序列化—
{“Id”:3,“Title”:“Roskilde”,“Description”:“著名的丹麦节日”,“StartingTime”:“2016-06-12T00:00:00”,“Duration”:“02:02:00”}
尝试反序列化持续时间字段时出现的错误:

无法解析的日期:“02:02:00”

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


您应该为日期和时间注册反序列化程序。大概是这样的:

try{
    // Convert JSON-string to a List of Event objects
    Type listType = new TypeToken<ArrayList<Event>>(){}.getType();
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
        @Override
        public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            try{
                DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH);
                return df.parse(json.getAsString());
            }
            catch(ParseException ex){
                return null;
            }
    });
    gsonBuilder.RegisterTypeAdapter(Time.class, new JsonDeserializer<Time>(){
        @Override
        public Time deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
                try{
                    DateFormat df = new SimpleDateFormat("HH:mm:ss", Locale.ENGLISH);
                    return df.parse(json.getAsString());
                }
                catch(ParseException ex){}
            }
            return null;
        }
    });
    Gson eventGson = gsonBuilder.create();
    events = dateGson.fromJson(json, listType);
}
catch(JsonParseException ex){
    ex.printStackTrace();
}
试试看{
//将JSON字符串转换为事件对象列表
类型listType=newTypeToken(){}.getType();
GsonBuilder GsonBuilder=新的GsonBuilder();
gsonBuilder.registerTypeAdapter(Date.class,新的JsonDeserializer()){
@凌驾
公共日期反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
试一试{
DateFormat df=新的SimpleDataFormat(“yyyy-MM-dd'T'HH:MM:ss”,Locale.ENGLISH);
返回df.parse(json.getAsString());
}
捕获(解析异常){
返回null;
}
});
gsonBuilder.RegisterTypeAdapter(Time.class,新的JsonDeserializer()){
@凌驾
公共时间反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
试一试{
DateFormat df=新的SimpleDataFormat(“HH:mm:ss”,Locale.ENGLISH);
返回df.parse(json.getAsString());
}
catch(ParseException ex){}
}
返回null;
}
});
Gson eventGson=gsonBuilder.create();
events=dateGson.fromJson(json,listType);
}
捕获(JsonParseException ex){
例如printStackTrace();
}

PS:这段代码没有经过测试,因为我没有太多时间。但我想你已经明白了大概的意思。您只需要两个JSONDESerializer,一个用于时间,一个用于日期。

添加另一个用于时间反序列化的类-确保将返回值转换为“时间”。 (另见:)

    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;
}
try{
    // Convert JSON-string to a List of Event objects
    Type listType = new TypeToken<ArrayList<Event>>(){}.getType();
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
        @Override
        public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            try{
                DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH);
                return df.parse(json.getAsString());
            }
            catch(ParseException ex){
                return null;
            }
    });
    gsonBuilder.RegisterTypeAdapter(Time.class, new JsonDeserializer<Time>(){
        @Override
        public Time deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
                try{
                    DateFormat df = new SimpleDateFormat("HH:mm:ss", Locale.ENGLISH);
                    return df.parse(json.getAsString());
                }
                catch(ParseException ex){}
            }
            return null;
        }
    });
    Gson eventGson = gsonBuilder.create();
    events = dateGson.fromJson(json, listType);
}
catch(JsonParseException ex){
    ex.printStackTrace();
}
    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);
        }
    }
    GsonBuilder gSonBuilder=  new GsonBuilder();
    gSonBuilder.registerTypeAdapter(Date.class, new DateDeserializer());
    gSonBuilder.registerTypeAdapter(Time.class, new TimeDeserializer());
    Gson gSon = gSonBuilder.create();