java - 如何使 GSON 在未知属性上失败

标签 java json gson

如果 json 包含未知字段,我需要 GSON 映射器抛出异常。例如,如果我们有像 POJO

public class MyClass {
    String name;
}

和json一样

{
    "name": "John",
    "age": 30
}

我想得到某种消息,json 包含无法反序列化的未知字段(年龄)。

我知道 Jackson 映射器中有开箱即用的解决方案,但在我们的项目中,我们多年来一直使用 Gson 作为映射器,使用 Jackson 最终会在项目的不同部分出现冲突和错误,所以它是对我来说,编写自己的解决方案比使用 Jackson 更容易。

换句话说,我想知道 Gson 中是否存在与 Jackson 的 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 等价的东西。或者如果可以使用 Gson 的 DeserializationStrategy 而不是使用反射来完成

最佳答案

我相信你不能用 Gson 自动完成。

我必须在工作项目中这样做。我做了以下事情:

Gson GSON = new GsonBuilder().create();
(static final) Map<String, Field> FIELDS = Arrays.stream(MyClass.class.getDeclaredFields())
    .collect(Collectors.toMap(Field::getName, Function.identity()));

JsonObject object = (JsonObject) GSON.fromJson(json, JsonObject.class);

List<String> objectProperties = object.entrySet().stream().map(Entry::getKey).collect(Collectors.toList());
List<String> classFieldNames = new ArrayList<>(FIELDS.keySet());

if (!classFieldNames.containsAll(objectProperties)) {
    List<String> invalidProperties = new ArrayList<>(objectProperties);
    invalidProperties.removeAll(classFieldNames);
    throw new RuntimeException("Invalid fields: " + invalidProperties);
}

关于java - 如何使 GSON 在未知属性上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65202860/

相关文章:

java - 使用gson将json解析为java对象的问题

java - 无法在 IntelliJ 中导入 Maven 项目

javascript - 如何在 javascript/jquery 中构建 json 字符串?

当 JSON 中存在时,需要 Java DynamoDB 验证异常 "key not given"

java - 使用 GSON 解析整个 AWS SQS 记录

java - 使用 Gson 的 GET 请求(java)

Java:最终特朗普如何抛出?

java - 我如何在 Java 中实现一个带有图像和 3 个不同字符串值的数组

java - 从 java 1.4 调用 .NET Web 服务

java - 如何以编程方式将内容写入json文件