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



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

这是有效的。:)

所以基本上,要么使用第一个选项,要么使用最后一个选项。

最新更新