我试图使用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}]
Run Code Online (Sandbox Code Playgroud)
这是代码:
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);
Run Code Online (Sandbox Code Playgroud)
例外情况表明日期格式无效:
com.google.gson.JsonSyntaxException: /Date(1350178408267)/
Run Code Online (Sandbox Code Playgroud)
有谁知道发生了什么?
mtm*_*ock 18
我在这里找到了答案,但我觉得很奇怪,没有一种更简单的方法.我使用的其他几个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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当我创建我的Gson对象时:
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new JsonDateDeserializer()).create();
Run Code Online (Sandbox Code Playgroud)
现在我的gson对象将能够解析.NET日期格式(自1970年以来毫秒).
Joz*_*ský 11
另一种解决方案是使用ISO 8601格式.这必须在Gson端配置为:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();
Run Code Online (Sandbox Code Playgroud)
以及在服务器端,例如对于Global.asax.cs文件中的ASP.NET MVC ,如下所示:
JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new IsoDateTimeConverter());
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = serializerSettings;
Run Code Online (Sandbox Code Playgroud)
上面代码的优点是它处理序列化和反序列化,因此允许日期/时间的双向传输.
注意:IsoDateTimeConverterclass是JSON.NET库的一部分.
小智 5
序列化和反序列化方法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();
Run Code Online (Sandbox Code Playgroud)