14

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)/

誰が何が起こっているのか知っていますか?

4

4 に答える 4

19

私はここで答えを見つけましたが、もっと簡単な方法がないのは奇妙だと思いました。私が使用した他のいくつかのjsonライブラリは、.NETjson形式をネイティブにサポートしています。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年以降のミリ)を解析できるようになります。

于 2012-10-14T02:20:23.040 に答える
5

シリアライズとデシリアライズの方法a. これを Adapter for 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();
于 2012-12-04T01:39:26.643 に答える