【问题标题】:How does gson maps JSON keys with the fields in Java classes while deserializing the JSONgson在反序列化JSON时如何将JSON键映射到Java类中的字段
【发布时间】:2019-03-02 05:09:17
【问题描述】:

我正在寻找这个已经有一段时间了,但我仍然不清楚。我有一个如下所示的 JSON 文件:

{
  "Name" : "Foo Bar",
  "Grade" : "Some Grade",
  "Org" : "Some Org"
}

为了反序列化这个 JSON(使用 gson),我创建了一个名为 StudentDetails.java 的 Java 类,如下所示:

public class StudentDetails
{
    public String name;
    public String grade;
    public String org;
}

现在我有几个问题:

  1. 是否会自动将StudentDetails.java 中的字段映射到相应的键,即使JSON 文件中的字段以小写开头并且键从大写开始。我一直在寻找@SerializedName,但我的代码甚至不用它就可以工作。相反,如果我使用带有名称字段的 @SerializedName("Name) 之类的东西,它会在反序列化后被分配为 null。我现在很困惑。
  2. 即使没有 getter 和 setter 方法,反序列化也能工作吗?在 jackson 中,您编写 setter 和 getter 方法。
  3. 如果上述情况属实,即使在私有字段的情况下也有效吗?

【问题讨论】:

  • 第二个它可以在没有 getter 和 setter 的情况下在 gson 中工作,第三个甚至它的私有它也可以用于序列化和反序列化。
  • 首先它会区分大小写,但是如果您使用 @SerializedName 进行注释,即使您可以像这样使用 @SerializedName(value="name", alternate={"Name ,它也适用于序列化和反序列化", "NAME"})

标签: java json gson json-deserialization


【解决方案1】:
  1. 我对此很确定,但我认为大小写仅在第一个字符之后才重要,因为您通常不会以大写字符开头的字段名称。 GSON 将自动映射字段。

  2. GSON 不需要需要 getter/setter (https://stackoverflow.com/a/6203975/4622620)

  3. GSON 可以处理私有字段,因为它使用反射 (https://stackoverflow.com/a/28927525/4622620)

【讨论】:

  • 感谢您的回答。是否有第一部分的任何文档或任何我可以从中获取详细信息的文章。
猜你喜欢
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多