Android 将Gson配置为使用多种日期格式

Android 将Gson配置为使用多种日期格式,android,date,gson,Android,Date,Gson,现在,当我想告诉gson如何解析日期时,我会: Gson gson= new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm").create(); 但我也有只包含日期的字段,还有一些只包含时间的字段,我希望这两个字段都存储为日期对象。如何执行此操作?此自定义序列化程序/反序列化程序可以处理多种格式。 您可以首先尝试使用一种格式进行解析,如果解析失败,则尝试使用第二种格式。 这也应该可以处理空日期,而不会出现爆炸 public class Gson

现在,当我想告诉gson如何解析日期时,我会:

Gson gson=  new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm").create();

但我也有只包含日期的字段,还有一些只包含时间的字段,我希望这两个字段都存储为日期对象。如何执行此操作?

此自定义序列化程序/反序列化程序可以处理多种格式。 您可以首先尝试使用一种格式进行解析,如果解析失败,则尝试使用第二种格式。 这也应该可以处理空日期,而不会出现爆炸

public class GsonDateDeSerializer implements JsonDeserializer<Date> {

...

private SimpleDateFormat format1 = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a");
private SimpleDateFormat format2 = new SimpleDateFormat("HH:mm:ss");

...

@Override
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    try {
        String j = json.getAsJsonPrimitive().getAsString();
        return parseDate(j);
    } catch (ParseException e) {
        throw new JsonParseException(e.getMessage(), e);
    }
}

private Date parseDate(String dateString) throws ParseException {
    if (dateString != null && dateString.trim().length() > 0) {
        try {
            return format1.parse(dateString);
        } catch (ParseException pe) {
            return format2.parse(dateString);
        }
    } else {
        return null;
    }
}

}
公共类GsonDateDeSerializer实现JsonDeserializer{
...
私有SimpleDataFormat 1=新SimpleDataFormat(“MMM dd,yyyy hh:mm:ss a”);
私有SimpleDataFormat 2=新SimpleDataFormat(“HH:mm:ss”);
...
@凌驾
公共日期反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
试一试{
字符串j=json.getAsJsonPrimitive().getAsString();
返回日期(j);
}捕获(解析异常){
抛出新的JsonParseException(e.getMessage(),e);
}
}
private Date parseDate(字符串dateString)引发ParseException{
if(dateString!=null&&dateString.trim().length()>0){
试一试{
返回format1.parse(日期字符串);
}捕获(解析异常pe){
返回format2.parse(日期字符串);
}
}否则{
返回null;
}
}
}
希望对你有所帮助,祝你的项目好运

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Date.class, new GsonDateDeSerializer());
gson = builder.create();

上述代码将新创建的GSONDATE反序列化程序作为GSON日期序列化程序应用于@reggoodwin创建的GSON日期序列化程序。为了更好地控制各个字段,最好通过注释控制格式:

@JsonAdapter(value = MyDateTypeAdapter.class)
private Date dateField;
…使用类型适配器沿以下几行操作:

public class MyDateTypeAdapter extends TypeAdapter<Date> {
    @Override
    public Date read(JsonReader in) throws IOException {
        // If in.peek isn't JsonToken.NULL, parse in.nextString() () appropriately
        // and return the Date...
    }

    @Override
    public void write(JsonWriter writer, Date value) throws IOException {
        // Set writer.value appropriately from value.get() (if not null)...
    }
}
公共类MyDateTypeAdapter扩展了TypeAdapter{
@凌驾
公共日期读取(JsonReader in)引发IOException{
//如果in.peek不是JsonToken.NULL,请适当地解析in.nextString()
//并返回日期。。。
}
@凌驾
public void write(JsonWriter writer,日期值)引发IOException{
//从value.get()中适当设置writer.value(如果不是null)。。。
}
}