Android 将Gson配置为使用多种日期格式
现在,当我想告诉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= 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)。。。
}
}