【问题标题】:How to map single JSON field to multiple JAVA field with GSON?如何使用 GSON 将单个 JSON 字段映射到多个 JAVA 字段?
【发布时间】:2016-11-25 12:58:31
【问题描述】:

我正在尝试使用 Retrofit 和 Gson 解析 JSON,但我需要映射一个 JSONfield 的值到 bean 类中的多个 JAVA 字段。

这是一个示例代码:

class A{

@SerializedName("name");
private String name;

@SerializedName("name");
private String fullName;

}

这是我看到的错误:A 类声明了多个名为 name 的 JSON 字段。有没有办法做到这一点?

更新:请避免建议从 bean 中删除一个字段或更改 getter 和 setter。这个项目很大,而且该字段后来在许多其他情况下都被使用,所以我不想弄乱结构。这个问题很清楚,也很重要。

【问题讨论】:

  • 你能提供你的json响应示例
  • 您可以使用自定义 gson 反序列化器实现此目的:javacreed.com/gson-deserialiser-example 但您的问题听起来很奇怪。我猜还有其他方法可以做您需要的事情,而不是将一个 json 文件映射到多个 java 字段。可能是这样的:` @SerializedName("name") private String name; public String getName() { 返回名称; } 公共字符串 getFullName() { 返回名称 } `
  • 或者如果你想要单独的设置器,那么你可以有类似的东西:` public String getFullName() { return TextUtils.isEmpty(fullName) ?名称:全名; } `
  • 这没有意义......如果你想在那里存储相同的值,只需删除 fullName
  • @VishalSanghani 你可以假设 JSON 是这样的:{ "name" : "foo" }

标签: java android json gson retrofit


【解决方案1】:

无需在setter gatter中为全名使用名称值声明JSON。

class A{

        @SerializedName("name");
        private String name;

        private String fullName;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getFullName() {
            return name;
        }

        public void setFullName(String fullName) {
            this.name = fullName;
        }
    }

【讨论】:

  • 总有一天,一些可怜的程序员会尝试猜测为什么在他刚刚设置 fullName 时名称会发生​​变化... setFullName 应该只设置 fullName ...
  • @Selvin 我刚刚向他展示了如何通过相同的插入实现两个变量。你不应该评判它。为什么你对这个答案投了反对票?是否有任何漏洞、错误或程序故障。
  • 你不应该评判它。 为什么? ... setter 应该是 setter ... 如果咖啡机上的按钮是“加牛奶的咖啡”,但是当您按下它时,机器会提供热机油? ... 这也不是问题的答案,即:如何使用 GSON 将单个 JSON 字段映射到多个 JAVA 字段?
  • 是的,我在代码之前已经提到过“无需在 setter gatter 中为全名使用名称值声明 JSON。”
  • @ReadyAndroid 我不能。如果我声明了两个字段,显然有一些原因。该字段在许多其他情况下使用并在以后进行修改。我只是希望它的值最初与其他字段相同。
猜你喜欢
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
相关资源
最近更新 更多