Gson:约会时的JsonSyntaxException

时间:2012-10-14 02:01:45

标签: java date gson

我正在尝试使用Gson反序列化json数组,但我目前正在获取JsonSyntaxException。 json字符串是由.NET MVC3 Web服务使用JsonResult创建的(意思是,我不是手动创建json,它是由我知道可以在其他几个平台上工作的库创建的。)

这是json:

[{"PostID":1,"StudentID":39,"StudentName":"Joe Blow",
"Text":"Test message.","CreateDate":"\/Date(1350178408267)\/",
"ModDate":"\/Date(1350178408267)\/","CommentCount":0}]

这是代码:

public class Post {
   public int PostID;
   public int StudentID;
   public String StudentName;
   public String Text;
   public Date CreateDate;
   public Date ModDate;

   public Post() { }
}

Type listOfPosts = new TypeToken<ArrayList<Post>>(){}.getType();
ArrayList<Post> posts = new Gson().fromJson(json, listOfPosts);

例外情况表明日期格式无效:

com.google.gson.JsonSyntaxException: /Date(1350178408267)/

任何人都知道发生了什么事?

4 个答案:

答案 0 :(得分:18)

我找到了答案here,但我觉得奇怪的是,这并不是一种更简单的方法。我使用的其他几个json库原生支持.NET json格式。当Gson没有处理它时我感到很惊讶。肯定有更好的办法。如果有人知道,请在这里发布。尽管如此,这是我的解决方案:

我创建了一个自定义的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();

现在我的gson对象将能够解析.NET日期格式(自1970年以来毫秒)。

答案 1 :(得分:11)

另一种解决方案是使用ISO 8601格式。这必须在Gson端配置为:

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();

以及服务器端,例如对于Global.asax.cs文件中的ASP.NET MVC,如下所示:

JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new IsoDateTimeConverter());
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = serializerSettings;

上面代码的优点是它处理序列化和反序列化,因此允许双向传输日期/时间。

注意:IsoDateTimeConverter类是JSON.NET library

的一部分

答案 2 :(得分:4)

序列化和反序列化方法a。将其注册为GSON适配器

JsonSerializer<Date> ser = new JsonSerializer<Date>() {
@Override
public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext 
         context) {
return src == null ? null : new JsonPrimitive(src.getTime());
}
};

JsonDeserializer<Date> deser = new JsonDeserializer<Date>() {
 @Override
 public Date deserialize(JsonElement json, Type typeOfT,
   JsonDeserializationContext context) throws JsonParseException {
return json == null ? null : new Date(json.getAsLong());
 }
 };

Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, ser)
.registerTypeAdapter(Date.class, deser).create();

答案 3 :(得分:2)

此解决方案适用于我使用SqlDateTypeAdapter:

SqlDateTypeAdapter sqlAdapter = new SqlDateTypeAdapter();
Gson gson = new GsonBuilder()
   .registerTypeAdapter(java.sql.Date.class, sqlAdapter)
   .setDateFormat("yyyy-MM-dd")
   .create();

参考:https://stackoverflow.com/a/30398307/7308789