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

时间:2015-03-18 18:39:25

标签: 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 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”以外的字符串?谢谢你的帮助!

1 个答案:

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