在我的MongoDB数据库中,有一些文档带有日期字段。通过使控制台查找结果如下:
"data" : ISODate("2015-03-01T00:40:45Z")
但当GSON试图检索对象时,出现了以下错误:
javax.servlet.ServletException: com.google.gson.JsonSyntaxException: 03-01-2015-01-40-45-000
我尝试使用GSONBuilder,如下所述,但错误仍然存在:
Gson gson= new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssX").create();
我该怎么解决这个问题?
我从服务器收到一个Json对象,它的Date值很长(Timestamp)。
我正在创建我的Gson对象:
final Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonDateDeserializer()).create();
这是我的JsonDateDeserializer:的代码
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.Date;
public class JsonDateDeserializer implements JsonDeserializer<Date> {
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
long time = json.getAsJsonPrimitive().getAsLong();
Date d = new Date(time);
return d;
}
}
更新的long-time=json.getAsJsonObject().getAsJsonPrimitive("$date").getAsLong();
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.Date;
public class JsonDateDeserializer implements JsonDeserializer<Date> {
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
long time = json.getAsJsonObject().getAsJsonPrimitive("$date").getAsLong();
Date d = new Date(time);
return d;
}
}
http://www.techiesinfo.com/performance
Employee employee = new GsonBuilder()
.registerTypeAdapter(LocalTime.class, new MyDateTypeAdapter())
.create().fromJson(json, Employee.class);
根据您的要求将"地点时间"更改为"日期"或"日期时间"。
public class MyDateTypeAdapter implements JsonDeserializer<LocalTime> {
@Override
public synchronized LocalTime deserialize(JsonElement jsonElement, Type type,
JsonDeserializationContext jsonDeserializationContext) {
try {
JsonPrimitive dateStr= jsonElement.getAsJsonObject().getAsJsonPrimitive("$date") ;
Instant instant = Instant.parse(dateStr.getAsString());
LocalTime localTime = LocalTime.ofInstant(instant, ZoneId.of(ZoneOffset.UTC.getId()));
return localTime;
} catch (Exception e) {
log.error("error calling deserialize {}", e);
throw new JsonParseException(e);
}
}
}
我也在使用Gson来反序列化JSON字符串。对我来说,以下格式都不起作用:
setDateFormat("yyyy-MM-dd'T'HH:mm:ssX").create(); //Didn't work
setDateFormat("yyyy-MM-dd'T'HH:mm:ssz").create(); //Didn't work
setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create(); //Didn't work
他们每个人都无法解析日期。所以我只是从格式中删除了最后一个字符。它奏效了。
setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); //worked
我知道这不是正确的方法,但至少它允许您暂时解析日期。
编辑:在这个链接上有一个更好的解决方案Gson:JsonSyntaxException。基本上,这就是答案的要点:
我创建了一个自定义JsonDeserializer,并为Date类型注册了它。通过这样做,Gson将使用我的反序列化程序来处理Date类型,而不是它的默认类型。如果您想以自定义方式序列化/反序列化任何其他类型,也可以对其执行同样的操作
public class JsonDateDeserializer implements JsonDeserializer<Date> {
public Date deserialize(JsonElement json, Type typeOfT,JsonDeserializationContext context) throws JsonParseException {
String s = json.getAsJsonPrimitive().getAsString();
long l = Long.parseLong(s.substring(6, s.length() - 2));
Date d = new Date(l);
return d;
}
}
然后,当我创建Gson对象时:
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonDateDeserializer()).create();"
第2版:原来上面反序列化()函数中的逻辑工作不正常。所以决定使用Joda时间库。这是修改后的功能:
public class JsonDateDeserializer implements JsonDeserializer<Date> {
public Date deserialize(JsonElement json, Type typeOfT,JsonDeserializationContext context) throws JsonParseException {
String s = json.getAsJsonPrimitive().getAsString();
DateTimeFormatter parser = ISODateTimeFormat.dateTimeParser();
DateTime dateTime = parser.parseDateTime(s);
return dateTime.toDate();
}
}
这是有效的。:)
所以基本上,要么使用第一个选项,要么使用最后一个选项。