当前位置: 首页 > 面试题库 >

Gson:日期上的JsonSyntaxException

堵德曜
2023-03-14
问题内容

我正在尝试使用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)/

有人知道发生了什么吗?


问题答案:

我在这里找到了答案,但奇怪的是,没有一种更简单的方法。我使用过的其他几个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年以来为millis)。



 类似资料:
  • 问题内容: 我正在尝试在Gson输出中使用自定义日期格式,但似乎不起作用,并且与相同。 就像Gson不在乎对象“日期”并以其方式打印它一样。 我该如何改变? 谢谢 编辑: 我总是用java.util.Date; setDateFormat()不起作用 问题答案: 似乎你需要同时定义日期和时间部分的格式或使用基于字符串的格式。例如: 或使用序列化程序: 我相信格式化程序无法产生时间戳,但是此串行器/

  • 我想使用此服务:http://fast-gorge.herokuapp.com/contacts我设置Retrofit解析如下: 其中,我的日期格式为: 然而,当我运行该应用程序时,我进入了failure(reformerror error)方法,并显示消息:reformation。改装错误:com。谷歌。格森。JsonSyntaxException:2014-07-31T07:49:23.000

  • 问题内容: 假设我有个约会2013年6月20日 如何获取上周的日期范围,即本例中的6月9日至6月15日。 另外,如果日期是2013年6月2日 范围应该是5月26日至6月1日 问题答案: 这是基于Java日历的解决方案 输出 它已本地化,在我的“语言环境”周中,从星期一开始

  • 问题内容: 我正在尝试使用python获取上个月的日期。这是我尝试过的: 但是,这种方法很糟糕,原因有两个:首先,它返回2012年2月的20122(而不是201202),其次它将返回0而不是1月的12。 我已经用bash解决了这个麻烦 我认为,如果bash为此目的具有内置方式,那么功能更强大的python应该比强迫编写自己的脚本来实现此目标更好。我当然可以做类似的事情: 我没有测试过此代码,也不想

  • 问题内容: 我有这个PHP代码: 我用它来获取当前日期,而我需要未来5年的日期,例如: 我怎样才能做到这一点? 问题答案: 尝试:

  • 我有几个带有日期的表,我正试图加入这些表来制作一个大表,其中数据按日期分组。 我现在通过左键联接来完成这个任务,从我需要联接的表中生成子选择(其中许多是同一个表,具有不同的查询位置,涉及SUM和COUNT,所以我认为我必须使用子选择)。我遇到的问题是,如果第一个表中没有一个日期,那么即使后续表中有一些行与该日期联接,它也不会显示在表中。我是根据DATE(datetime_column)联接的。 所