在我的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();
我该如何解决这个问题?
答案 0 :(得分:0)
我也在使用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 on date有更好的解决方案。基本上,这是答案的要点:
我创建了一个自定义的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:原来上面的deserialize()函数中的逻辑无法正常工作。所以决定使用Joda-Time库。这是修改后的功能:
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();
}
}
这很有效。 :)
所以基本上,要么使用第一个选项,要么使用最后一个选项。
答案 1 :(得分:0)
我从服务器收到一个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;
}
}
答案 2 :(得分:0)
更新了long time = json.getAsJsonObject()。getAsJsonPrimitive(&#34; $ date&#34;)。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;
}
}