当JSON字符串包含与目标POJO类不匹配的字段名时,GSON似乎默默地忽略。概述的一个解决方案here建议使用注释标记" required"在反序列化不包含字段的字符串时,GSON失败的字段。
但是我们定义我们的POJO必须是"确切的"匹配(当我们允许传入的对象为null时,它们必须在POJO中声明为Optional字段 - 并且我们有一个特殊的类型适配器,它将null转换为Optional.empty()实例)。因此,POJO中的所有字段都是必填字段。并且null不是有效值。
按照我所链接的那个问题的指导,似乎只有 方式让gson在解析时失败:做一个完整的"深度反思"扫描反序列化过程创建的对象,并检查是否有任何可选字段为空。
或者也许 - 我错过了一些东西,当我们的JSON字符串包含错误的字段名称时,有一种更简单的方法让gson 告诉我?
(背景:我们刚遇到一个问题,因为嵌套结构中的内部名称错误 - 导致我们没有预料到它们的空对象)
答案 0 :(得分:2)
原来:这个“缺陷”实际上是gson的核心设计点:它是一个JSON 解析器。验证在gson范围内不。
因此,“正确”的答案是使用java bean validation注释并将一些实施框架(例如hibernate validator或apache bval)放在适当位置。
或者,可以在创建gson实例时注册特殊类型的适配器。这种类型的适配器使用反射来覆盖内部映射,并使用一些检查代码 - 允许相对“干净”的解决方案,这会导致gson在运行到“未知”字段时抛出异常。 (感谢Andy Turner指向相应的github issue tracker条目---代码可以在那里找到)