Java 在Gson中,如何在反序列化期间检测类型不匹配?

Java 在Gson中,如何在反序列化期间检测类型不匹配?,java,json,serialization,gson,deserialization,Java,Json,Serialization,Gson,Deserialization,gson.fromJson(json,type)将json转换为类对象。假设我有如下的json数据 { "randomTiles": "true", "randomNumbers": "false", "randomPorts": "false", "name": "test" } json反序列化到的类定义为 public class CreateGameRequest { public String name; public boolean randomTi

gson.fromJson(json,type)
将json转换为类对象。假设我有如下的json数据

{
  "randomTiles": "true",
  "randomNumbers": "false",
  "randomPorts": "false",
  "name": "test"
}
json反序列化到的类定义为

public class CreateGameRequest {
    public String name;
    public boolean randomTiles;
    public boolean randomNumbers;
    public boolean randomPorts;
}
当我打电话时

gson.fromJson(json, type)
然后它应该解析json数据并将其转换为
CreateGameRequest
对象。现在的问题是假设数据类型不好,所以看起来像

{
  "randomTiles": "asdasd",
  "randomNumbers": "zxczxc",
  "randomPorts": "asdzxc",
  "name": "test"
}

现在,当调用json.fromJson()或者换句话说,当反序列化到上述类对象时,Gson会默默地认为“asdasd”是“false”,而不会引发类型不匹配的异常。我注意到
.fromJson()
抛出
JsonSyntaxException
,但只有假设json对象中的
布尔值
字段中有一个没有引号的数字,但似乎没有检测到除“true”和“false”之外的文本,才会抛出该异常在json对象的
boolean
字段中..您知道如何检测json对象在
boolean
字段中是否包含“true”和“false”以外的字符串吗?谢谢你的帮助

Gson尽最大努力将JSON值转换为
boolean
值,认为大部分内容都是false-y。我相信它使用
Boolean.valueOf(String)
进行转换

您可以通过注册自己的反序列化程序来更加严格

class JsonBooleanDeserializer implements JsonDeserializer<Boolean> {
    @Override
    public Boolean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        try {
            String value = json.getAsJsonPrimitive().getAsString();
            if ("true".equals(value) || "false".equals(value)) {
                return Boolean.valueOf(value);
            } else {
                throw new JsonParseException("Cannot parse json '" + json.toString() + "' to boolean value");
            }
        } catch (ClassCastException e) {
            throw new JsonParseException("Cannot parse json '" + json.toString() + "' to boolean value", e);
        }
    }
}
Gson gson = new GsonBuilder()
    .registerTypeAdapter(Boolean.class, deserializer)
    .registerTypeAdapter(boolean.class, deserializer)
    .create();