【问题标题】:Recursive custom Gson deserializer递归自定义 Gson 反序列化器
【发布时间】:2021-03-21 00:01:55
【问题描述】:

我需要创建一个自定义的 Gson 反序列化器,当它被调用时会递归地进入对象并使用相同的概念反序列化它们

对于这个例子,让我们创建一个 JSON 对象:

{
  "name": "Hello world!",
  "foo": {
    "bar": [12, 13, 14],
    "type": "A"
  }
}

然后是类,对于这个演示,有 2 个类 MainOutputClass 从反序列化器中调用,反序列化器应该从 JSON 中的 foo 对象反序列化子类

@ExposeAs() 用于告诉反序列化器采用哪个 JSON 对象。

public class MainOutputClass {

    @ExposeAs("name")
    private String nameString;

    @ExposeAs("foo")
    private SubClass subClass;

}

最后是递归演示的子类:

public class SubClass {

    @ExposeAs("bar")
    private List<Integer> bars;

    @ExposeAs("type")
    private String type;

}

我设法创建了一个反序列化器,可以完美地反序列化 Main 目标类,但我似乎无法让它适用于非原始子类。

我知道这是一个非常奇怪的问题,但我找不到任何资源来解决这个问题。 感谢您的帮助,感谢您抽出宝贵时间阅读本文。

【问题讨论】:

  • 我不明白。 Gson 在设计上是递归的,因此您不需要创建任何自定义来支持它。它还支持使用 @SerializedName 注释映射自定义名称。你能提供一个你没有看到它这样做的具体例子吗?
  • 这完全解决了我的问题,我不知道我怎么错过了@SerializedName注解。谢谢!
  • 哈。我没有意识到那是您正在寻找的答案。 :-) 很高兴我能帮上忙!如果您想将我的答案标记为一些荣誉点,我会在下面抛出。

标签: java json gson


【解决方案1】:

OP 正在寻找 @SerializedName 注释,该注释用于转换名称,因为它应该以 JSON 格式存在,而不是 Java 中的字段名称。

为了后代,如果你使用 Jackson 解析器,你可以使用 @JsonProperty 来达到同样的效果。

When is the @JsonProperty property used and what is it used for?

【讨论】:

    【解决方案2】:

    正如Atmas 所指出的,我需要做的就是在字段中添加@SerializedName 注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 2019-10-19
      相关资源
      最近更新 更多