【问题标题】:java gson - is it possible to deserialize an object from a string without having all of its fieldsjava gson - 是否可以在没有所有字段的情况下从字符串反序列化对象
【发布时间】:2026-02-11 12:45:01
【问题描述】:

假设我正在向对象添加一个字段,但我仍然得到相同的字符串。我可以将其 de-Json 转换为缺少字段设置为 null 的对象吗? 如果我在那里有原始变量怎么办? 10 倍

【问题讨论】:

  • 您能否提供一些示例或更多说明。这是一个非常模糊的问题。

标签: java gson xml-deserialization


【解决方案1】:

嗯,取决于反序列化是如何完成的。如果首先使用无参数构造函数创建对象,然后通过设置器或反射设置字段,我会说这应该有效。在这种情况下,对其他对象的每个引用都将为空,而原始类型获取它们的默认值(对于数字 0,对于布尔值 false 等)

【讨论】:

  • 这还是个问题。在老客户中,我会得到一个带有新字段的 gson 字符串。他们抛出一个 IllegalArgumentException
  • 你能发布 IllegalArgumentException 的堆栈跟踪吗?它可能是一些永远不应该为空的字段。
  • 我的错误。仔细检查,它确实按照您描述的方式工作。在使用 GSON 之前,我忘记将字符串替换为较新的类 nae。
  • 是的,这就是问题所在,我使用的是原始类型,它给了我默认值
【解决方案2】:

是的

Gson - Finer Points with Objects

反序列化时,JSON 中缺少条目会导致将对象中的相应字段设置为 null

【讨论】:

    【解决方案3】:

    您可以使用 XStream 来(反)序列化为 JSON,这就是他们处理新字段的方式:http://x-stream.github.io/faq.html#Serialization_newer_class_versions

    所以简短的回答是:引用将是空引用,原语将保留它们在构造函数中获得的值

    【讨论】:

    • 我可以用 GSON 做吗?我的项目使用 GSON,我想继续使用这个 jar(除非我必须转换为替代方案)
    • "如果从类中删除了一个字段,反序列化包含该字段的旧版本将导致异常。"所以这意味着我将不得不升级我的所有客户端。我想找到一个解决方案来避免它。 10x
    • 在这种情况下,您可以使用专为您的情况设计的 @Since 注释:sites.google.com/site/gson/…
    最近更新 更多