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

标签 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”以外的文本。你知道我如何检测 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();

关于java - 在 Gson 中,如何在反序列化期间检测类型不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29130147/

相关文章:

serialization - 使用 ProtoBuf 时最好的加密方法是什么?

json - Bigtable/HBase : Rich column family vs a single JSON Object

json - AWS AppSync : How to return valid JSON via DynamoDB

java - 在 Web 应用程序中使用 Java(桌面)代码库

java - removeEventListener() 不是 Firebase Firestore 的一部分吗?

java - 使用 Gson 在 Java 中反序列化任意 JSON 并尊重整数

c# - 在 C# 中将 json 对象列表反序列化为 POCO 对象

java - 反序列化定义已更改的类

java - 如何在java中将响应解析为JSON

java - 如何使用 Java 将包含 JSON 对象的字符串转换为实际的 JSON