gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:55:14 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com