java – Gson:JsonSyntaxException on date

我试图使用Gson反序列化一个json数组,但是我正在得到一个JsonSyntaxException. json字符串由使用JsonResult的.NET MVC3 Web服务创建(意思是,我不是手动创建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)/

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

解决方法

我发现一个答案 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年以来的millis).

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...