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();