【问题标题】:Conversion from Json to Java Object, the int variable is by default assigned value 0, if not passed in JSON从 Json 到 Java Object 的转换,int 变量默认赋值为 0,如果没有传入 JSON
【发布时间】:2019-08-21 23:18:53
【问题描述】:

我正在使用gson.fromJson(json,class) 将 json 转换为 Java 对象。 如果我没有在 json 中传递参数(int 除外),则将其反序列化为 null,但对象中的 int 变量将反序列化为 0。

所以我的问题是,是否有任何注释或我可以使用的任何方式,所以如果我没有在 json 中传递 int 参数,它不会被反序列化为 0。理想情况下,它不会显示在全部在对象中,但至少是null

例如下面的json:{"name":"asas"}

如果我有上面的json,那么使用gson.fromJson(),会自动将id反序列化为0。

有办法消除吗?

public class Student{

    String name;
    int id;

    //getters and setters
}

【问题讨论】:

  • 那么,如果 id 不在 JSON 中,您希望将其设置为什么值?
  • 如果参数全部被忽略会很好,但如果不可能,则为null,但我认为null也不可能。添加任何其他值都会破坏代码
  • 好的,让我换个方式问。您希望将哪个2^32 可能的int 值分配给int 字段? Null 不是 int 值。 Ignored 不是 int 值。也许int 不是您要查找的数据类型。
  • 如果您在 id 字段上使用 Integer 类型而不是 int ,则可能为 Null,否则正如 @DawoodibnKareem 所说,id 字段必须具有一些值
  • 是的,现在我意识到不应使用 int,但它已被使用,我现在无法更改。所以,没有办法,我们可以忽略设置值,如果它不存在于 json 中?

标签: java json


【解决方案1】:

如果参数一起被忽略就好了,但是如果不可能就null,不过我觉得null也不可能

不可能忽略参数,因为对象被定义为具有字段 - 与序列化时不同,当您不能将空字段写入输出 JSON 时,反序列化需要您创建对象,并且该对象将具有其字段,因为它们是定义该对象的内容。即,为了忽略 id(如果它不存在),您必须反序列化为另一个对象,而不需要 id

解决您的问题:

int 不能为空。这是一个原始的。 Primitives cannot be null.

Integer 可以为空。因为Integer 是一个对象。将int id; 更改为Integer id;,必要时更改edit your GSON config to get the behavior you want

【讨论】:

  • 非常感谢,我们可以用其他方式吗?得到Java对象后,我必须把它转换成xml。如果为字段分配了某个值,是否可以在忽略要包含在 xml 中的参数的字段上进行一些注释。
  • 视情况而定。基本上任何框架都允许您在序列化时忽略null 值。如果您想忽略 other 值,那么您可能需要使用 getter 方法进行序列化(查看如何执行此操作),并在您希望实际值时让 getter 返回 null被忽略。
  • 另外,请注意:如果您想保留您的 int 但在输入 json 中为 null 时不将其反序列化为 XML,检查它是否为 0可能会引入一个错误:您将不知道输入 json 是否有一个 null int,或者它有一个 实际上是 0 的 int
  • 是的,在这种情况下,我可能会选择负值。感谢您提供信息,那么我应该查找/阅读什么来返回 null,我对 Gson 库不太熟悉,请您推荐一些好的链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2021-03-18
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多