gson.fromJson(json, type)
将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对象的boolean
字段中有一个没有引号的数字但是似乎没有检测到除了json对象的boolean
字段中的“true”“false”。您知道如何在boolean
字段中检测json对象是否包含“true”“false”以外的字符串?谢谢你的帮助!
答案 0 :(得分:2)
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();