【问题标题】:How to copy and modify the POJO class objects created by JSON response from Retrofit2.0如何从 Retrofit2.0 复制和修改 JSON 响应创建的 POJO 类对象
【发布时间】:2018-05-29 08:46:50
【问题描述】:

例如,我收到以下 JSON 响应:

{
  "metadata": {
    "provider": "ABC"
  },
  "results": [
    {
      "id": "ace",
      "language": "en",
      "lexicalEntries": [
        {
          "lexicalCategory": "Noun"
        },
        { 
          "lexicalCategory": "Adjective"
        },
        {
          "lexicalCategory": "Verb"
        }
      ],
      "type": "headword",
      "word": "ace"
    }
  ]
}

我正在使用 Retrofit2.0 和 gson 对其进行解析并以下列方式映射到 POJO 类:

class QueryResponse {
    public Metadata metadata;
    public List<Result> results = null;
}
class Result {
    public String id;
    public String language;
    public List<LexicalEntry> lexicalEntries = null;
    public String type;
    public String word;
}

class LexicalEntry {
    public String lexicalCategory;
}

onResponse() 看起来像这样:

@Override
public void onResponse(Call<QueryResponse> call, Response<QueryResponse> response) {
     if (response.code() == 200) {
         Result result = response.body().results.get(0);
         lexicalEntries = result.lexicalEntries;
     }
}

现在我有另一种方法,我想创建自己的新 LexicalEntry 对象(即,reprecedLexicalEntry)并从从 JSON 检索到的值复制值,然后以我自己的方式修改它以进一步重用。

private void createSubWords(List<LexicalEntry> lexicalEntries) {
    LexicalEntry revisedLexicalEntry;
    for (int x = 0; x < lexicalEntries.size(); x++) {
        revisedLexicalEntry = lexicalEntries.get(x);
        revisedLexicalEntry.lexicalCategory = "Something...";
    }
}

后来发生的情况是,当我尝试获取原始 JSON (lexicalEntries.get(x).lexicalCategory) 的 lexicalCategory 时,它也更改为“Something...”,而不是原来的值。

我如何才能实现保留原件价值但复制和修改以供进一步使用的目标?我只是希望我的问题足够清楚。

提前致谢!

P.S.,我正在使用的实际 JSON 要复杂得多,但我在这里对其进行了简化,以便更好地理解和更快地提出建议。

【问题讨论】:

  • 如果您想修改 json 响应并再次转发,您可以在 stackoverflow.com/questions/35773028/… 中看到我的回答
  • 好吧,我想保留原始响应并使用原始值完整地创建 POJO 类对象。但是,我想从那里获取数据,然后对其进行修改以供进一步使用。当我尝试这样做时,原始数据也会发生变化。您在给定链接中的答案可能涉及更改响应。

标签: android json gson retrofit2 pojo


【解决方案1】:

我怎样才能实现保留原件价值但复制和修改以供进一步使用的目标?

使用新值创建一个新的LexicalEntry 对象,而不是像现在这样更改现有对象。

【讨论】:

  • 或许,上面的例子过于简化了。实际上,LexicalEntry 对象中的字段不仅仅是 lexicalCategory。我想保留所有其他字段并仅更改 lexicalCategory 的值。这就是为什么我想先复制原件然后修改它,而不是制作一个新的 LexicalEntry 对象。
  • @ShahoodulHassan:“我想保留所有其他字段并仅更改 lexicalCategory 的值” - 使用该字段的新值创建一个新的 LexicalEntry 对象并为其分配旧值对于其他领域。 “我想先复制原件然后修改它,而不是制作一个新的 LexicalEntry 对象”——制作一个副本就是制作一个新对象。如果你从 1 个对象开始,当你完成后你有 2 个对象,你就创建了一个新对象。在 Java 中执行此操作的方法是通过构造函数,例如 a copy constructor
  • 复制构造器解决方案的作用就像一个魅力。谢谢!
  • 我还找到了另一种解决方案,即通过实现Cloneable 接口来克隆旧对象,覆盖 clone() 方法,然后在旧对象上使用它。它也可以达到目的,但推荐使用哪一个:复制构造函数还是克隆?
  • @ShahoodulHassan:这两个的复制构造函数is the better choice
猜你喜欢
  • 2020-10-31
  • 1970-01-01
  • 2022-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 2017-04-22
  • 2019-06-13
相关资源
最近更新 更多