14

ExceptionEntity何か問題が発生した場合に、結果としてシリアル化されたクラスを返す REST サービスを作成しました。

Gson.fromJson()逆シリアル化する必要があるjsonの型が異なる場合、例外をスローしたいと思います。たとえば、逆シリアル化する必要がある次の文字列があります (my.ExceptionEntity.class):

{"exceptionId":2,"message":"Room aaaa already exists."}

ただしRoom、このシリアル化された文字列の型としてクラスを使用します。

String json = "{\"exceptionId\":2,\"message\":\"Room aaaa already exists.\"}";
Room r = gson.fromJson(json, Room.class);
// as a result r==null but I want to throw Exception; how?

[編集] 私はこれをテストしましたが、動作しません:

try {
    return g.fromJson(roomJson, new TypeToken<Room>(){}.getType());
    // this also doesn't work
    // return g.fromJson(roomJson, Room.class);
} catch (JsonSyntaxException e) {
    pepuch.multiplayergame.entity.Exception ex = g.fromJson(roomJson, pepuch.multiplayergame.entity.Exception.class);
    throw ExceptionController.toGameServerException(ex);
} catch (JsonParseException e) {
    pepuch.multiplayergame.entity.Exception ex = g.fromJson(roomJson, pepuch.multiplayergame.entity.Exception.class);
    throw ExceptionController.toGameServerException(ex);
}
4

2 に答える 2

17

GSonのドキュメントによると、指定したタイプに従って json ストリームを逆シリアル化できない場合、例外は既にスローされています。

例外: JsonParseException- json が classOfT 型のオブジェクトの有効な表現でない場合

ただし、これは未チェックの例外です。カスタム例外を提供したい場合は、試してみてください

try {
  Room r = gson.fromJson(json, Room.class);
}
catch (JsonParseException e) {
  throw new YourException();
}
于 2013-03-25T17:15:47.137 に答える