当前位置: 首页 > 知识库问答 >
问题:

GSON有没有办法做到“毫不宽容”?

侯英达
2023-03-14

当JSON字符串包含与目标POJO类不匹配的字段名时,GSON似乎会自动忽略。这里概述的一个解决方案建议在对不包含字段的字符串进行反序列化时,使用注释标记“必需”字段以使GSON失败。

但是我们定义我们的POJO必须是“精确”匹配的(当我们允许传入对象为空时,它们必须在POJO中声明为可选字段——并且我们有一个特殊的类型适配器,可以将空值转换为Optional.empty()实例)。因此POJO中的所有字段都是强制性的。null不是一个有效的值。

按照我链接的那个问题中的指导,让gson在解析时失败的唯一方法似乎是:对反序列化过程创建的对象进行完整的“深度反射”扫描,并检查是否有任何可选字段为空。

或者也许 - 我错过了一些东西,并且有一种更简单的方法可以让 gson 告诉我当我们的 JSON 字符串包含错误的字段名称时?

(背景:我们刚刚遇到了一个问题,因为嵌套结构中的字段名错误——导致了我们没有想到的空对象)

共有1个答案

钱睿范
2023-03-14

事实证明:这个“缺陷”真的是 gson 的核心设计点:它是一个 JSON 解析器。验证不在 gson 的范围内。

因此,“正确”的答案是使用javabean验证注释,并将一些实现框架(例如hibernate验证器或apachebval)放置到位。

或者,可以在创建gson实例时注册一个特殊类型的适配器。这种类型适配器使用反射来覆盖一个内部映射,并带有一点检查代码——允许一个相对“干净”的解决方案,这会导致gson在运行到“未知”字段时抛出异常。(感谢Andy Turner指向相应的github问题跟踪条目——代码可以在那里找到)

 类似资料:
  • 我有一个json看起来像这样: 如您所见,loc对象有时是json对象,有时是双数组。在不编写自定义反序列化程序的情况下,有没有办法避免,并在loc对象是json对象而不是双数组时将其设置为null。

  • 问题内容: 假设我有一个使用lambda表达式(闭包)定义的对象列表。有没有一种方法可以检查它们以便进行比较? 我最感兴趣的代码是 完整的代码是 似乎唯一的解决方案是将每个lambda定义为一个字段,并且仅使用这些字段。如果要打印出称为的方法,最好使用。lambda表达式有更好的方法吗? 此外,是否可以打印lambda并获得人类可读的内容?如果你打印而不是 得到类似的东西 甚至使用和方法。 问题答

  • 问题内容: 有没有一种方法可以在比其父对象更宽的父容器DIV中包含子DIV 。子DIV必须与浏览器视口的宽度相同。 子DIV 必须保留为父div的子。我知道我可以在子div上设置任意的负边距以使其更宽,但是我不知道如何从根本上使它成为浏览器宽度的100%。 我知道我可以这样做: 但是我需要孩子的宽度与动态浏览器的宽度相同。 Update 感谢您的回答,到目前为止,似乎最接近的答案是将子DIV位置设

  • Spring HATEOAS提供了方便的ControllerLinkBuilder来创建指向控制器方法的链接,这些方法将作为HREF添加到返回给客户端的JSON/XML中。例如: ... 可能会生成类似以下内容的JSON: 然而... 我倾向于通过反向代理访问我的服务。我想大多数人可能会这样做。这让我可以在不同的端口上运行多个服务,但让我可以通过相同的基本URL访问它们。不幸的是,通过代理访问意味

  • 这个程序应该输出 但是如果我输入的大小是4,我只输入这些值,但是如果我写的大小是4。。。它不需要我提供4个参数,而是需要3个参数并打印('',1,2,3) 请帮帮忙

  • 我希望修改 VS Code 的缩进行为,以便在键入如下行后按 Enter 键: 它将缩进到左括号的级别,这样我就可以轻松地将代码格式化如下: 我希望它也适用于开放方括号和花括号: 我希望我使用的几乎所有语言都有这种行为,尽管在C或C#中使用大括号行为是不必要的(甚至可能是不可取的)。 这与Sublime文本的设置非常相似。 有什么办法可以做到这一点?如果没有设定,我愿意做任何必要的修改。我也乐于接

  • 问题内容: 请考虑以下表格: 部 员工 编写查询以返回人员总数为4或更多的那些部门的雇员的empname和deptname列。记录应按姓氏的字母顺序返回 这是我的看法: 您将如何对此进行改进? 问题答案: 这比较短,而且执行速度可能也更快 从分组开始。您不需要内部查询中的COUNT。然后,联接两个表只是为了获得名称。 *之所以使用 *INNER JOIN, 是因为一旦计数完成,我们已经知道 员工存

  • 我有一个由多个类实现的接口,这些类也有一些额外的方法。如果我自动连接这个类。有没有办法自动安装这些额外的方法? 例如─ 界面 服务1 服务2 如果我尝试像这样直接自动连接服务- 然后我得到了类似这样的错误-