14

我创建了 REST 服务,ExceptionEntity如果出现问题,它会返回序列化的类。

如果应该反序列化的 jsonGson.fromJson()类型不同,我想抛出一些异常。例如,我有这个应该反序列化的字符串(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 回答
0

尝试先将其转换为 Json,然后将其转换为您想要的对象类型。

val newJson = Gson().toJson(json)

val r = gson.fromJson(json, Room.class)

于 2020-10-03T13:19:21.117 回答