当我尝试在MongoDB中检索具有日期的文档时出错“gson.JsonSyntaxException”

时间:2015-03-01 01:42:22

标签: java json mongodb date gson

在我的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();

我该如何解决这个问题?

3 个答案:

答案 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;
      }
 }

http://www.techiesinfo.com/performance