Java Gson.fromJson()-如果类型不同,则引发异常

Java Gson.fromJson()-如果类型不同,则引发异常,java,gson,Java,Gson,我创建了REST服务,如果出现问题,它将返回ExceptionEntity序列化类 如果应该由Gson.fromJson()反序列化的json的类型不同,我想抛出一些异常。例如,我有一个应该反序列化的字符串(my.ExceptionEntity.class): 但是我使用Room类作为这个序列化字符串的类型: String json = "{\"exceptionId\":2,\"message\":\"Room aaaa already exists.\"}"; Room r = gson.f

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

如果应该由
Gson.fromJson()
反序列化的json的类型不同,我想抛出一些异常。例如,我有一个应该反序列化的字符串(my.ExceptionEntity.class):

但是我使用
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);
}
试试看{
返回g.fromJson(roomJson,newTypeToken(){}.getType());
//这也不起作用
//返回g.fromJson(roomJson,Room.class);
}捕获(JsonSyntaxException e){
pepuch.multiplayergame.entity.Exception ex=g.fromJson(roomJson,pepuch.multiplayergame.entity.Exception.class);
抛出ExceptionController.toGameServerException(ex);
}捕获(JSONParsee异常){
pepuch.multiplayergame.entity.Exception ex=g.fromJson(roomJson,pepuch.multiplayergame.entity.Exception.class);
抛出ExceptionController.toGameServerException(ex);
}
根据GSon,如果无法根据您提供的类型反序列化json流,则已引发异常:

抛出:
JsonParseException
-如果json不是ClassSoft类型对象的有效表示形式

但这是一个未经检查的异常,如果您想提供一个自定义异常,您应该尝试使用它

try {
  Room r = gson.fromJson(json, Room.class);
}
catch (JsonParseException e) {
  throw new YourException();
}

首先尝试将其转换为Json,然后将其转换为所需的对象类型

val newJson = Gson().toJson(json)

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

我已经编辑了我的问题。我已经对此进行了测试,但它不起作用。您可以尝试使用
Room r=gson.fromJson(…);如果(r==null)抛出新异常(…)是的,您是对的,但这是错误的:/Documentation说这些方法应该抛出
JsonParseException
但它们没有:/正如我所知
null验证
是一种错误的模式。可能重复的方法只会抛出JsonSyntaxException。您不需要捕获JsonParseException
val newJson = Gson().toJson(json)