当我尝试在MongoDB中检索带有日期的文档时,出现错误“gson.jsonSyntaxException”

nkkqxpd9  于 2022-11-06  发布在  Go
关注(0)|答案(4)|浏览(152)

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

我该如何解决这个问题?

wbgh16ku

wbgh16ku1#

我从服务器接收到一个Json对象,其中Date的值(时间戳)很长。
我正在创建我的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;
    }
}
ktecyv1j

ktecyv1j2#

更新的长时间= json.getAsJsonObject().getAsJsonPrimitive(“$日期”).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

3ks5zfa0

3ks5zfa03#

我还使用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();
  }
}

这是工作。:)
所以基本上,要么使用第一个选项,要么使用最后一个选项。

cnwbcb6i

cnwbcb6i4#

Employee employee = new GsonBuilder()
            .registerTypeAdapter(LocalTime.class, new MyDateTypeAdapter())
            .create().fromJson(json, Employee.class);

根据需要将Locatime更改为Date或Datetime。

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);
    }
}

}

相关问题