【问题标题】:Parsing JSON from API with GSON [duplicate]使用 GSON 从 API 解析 JSON [重复]
【发布时间】:2019-05-17 21:55:59
【问题描述】:

我正在通过改造进行 API 调用,问题是我从调用中获得的 JSON。通常它是一个简单的 Json,里面有一个数组。

[
  {
    "herbID": 1,
    "nameTrival": "Baldrian",
    "nameWissenschaft": "Valeriana officinalis",
  ....
  },
  {
    "herbID": 2,
    "nameTrival": "Ringelblume",
    "nameWissenschaft": "Calendula officinalis",
  ....
  },
  ....
]

新调用如下所示

 [
  [
    {
      "nameTrival": "Baldrian",
      "nameWissenschaft": "Valeriana officinalis",
      "hoeheFrom": 20,
      "hoeheTo": 200,
      "familie": "Baldriangewaechse",
      "pflanzentype": "Staude",
      "auffaelligkeiten": "Je nach Standort sind die Fiederblätter schmäler oder breiter sowie dunkel- oder hellgrün, oft auch unterschiedlich geformt."
    }
  ],
  [
    {
      "standort": "Ufer"
    },
    {
      "standort": "Graben"
    },
    {
      "standort": "Wiesen"
    },
    {
      "standort": "Waldrand"
    }
  ],
  [
    {
      "gebiet": "Nordeuropa"
    },
    {
      "gebiet": "Südeuropa"
    },
    {
      "gebiet": "Westeuropa"
    },
    {
      "gebiet": "Osteuropa"
    },
    {
      "gebiet": "Südosteuropa"
    },
    {
      "gebiet": "Mitteleuropa"
    },
    {
      "gebiet": "Südwesteuropa"
    },
    {
      "gebiet": "Nordosteuoropa"
    },
    {
      "gebiet": "Nordwesteuropa"
    }
  ],
  {
    "fieldCount": 0,
    "affectedRows": 0,
    "insertId": 0,
    "serverStatus": 34,
    "warningCount": 0,
    "message": "",
    "protocol41": true,
    "changedRows": 0
  }
]

我用下面的代码解析了第一个Json

Call<List<Herb>> call = service.getAllHerbs();

            call.enqueue(new Callback<List<Herb>>() {
                @Override
                public void onResponse(Call<List<Herb>> call, Response<List<Herb>> response) {
                    herbList = response.body();
                    loadDataList(herbList);
                }

                @Override
                public void onFailure(Call<List<Herb>> call, Throwable t) {
                    Toast.makeText(PlantListActivity.this, "Unable to load herbs\nCheck your internet connection", Toast.LENGTH_LONG).show();
                }
            });

新的类是这样的

public class Herb{
    ArrayList<Botanical> botanical;
    ArrayList<Location> locations;
    ArrayList<Area> areas;

    public ArrayList<Botanical> getBotanical() {
        return botanical;
    }
    public ArrayList<Location> getLocations() {
        return locations;
    }
    public ArrayList<Area> getAreas() {
        return areas;
    }
}

使用新的 Json 和类,它总是失败并出现错误 "java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $"

在我将它们声明为 ArrayList 之后,我不是告诉 gson 下面是一个数组吗?我的课出了什么问题?

编辑: 可能的重复和我的问题之间的区别是,另一个有带有名称的数组。我的 json 数组没有,这就是为什么我很难解析它们。

【问题讨论】:

  • 您能否发布您拥有的完整 JSON?
  • @ReazMurshed 我更新了 json 部分,现在是我得到的完整 json。这是特定草药的详细反应。

标签: java android json gson retrofit2


【解决方案1】:

如果你想处理类型为Herb类的响应,那么你需要修改服务响应

而不是 [{},{},{}] // 这很难处理

试试这个必须在服务器端完成

{
                "botanical":[],
                "area" : [],
                "location" : []
 }

然后电话将是Call&lt;Herb&gt; someMethod();

如果无法更改 然后将其作为 JsonArray 处理

Call&lt;JsonArray&gt; someMethod();

通过这种方式,您可以处理现有响应并获取值键并根据要求进行解析。但不推荐这样做,因为如果将来发生变化并且需要大量更改,则很难维护

【讨论】:

    【解决方案2】:

    问题是你告诉 Gson 你有一个你的类型的对象。你没有。您有一个类型的对象数组。你不能只是尝试像那样投射结果并期望它神奇地工作;)

    Gson 的用户 guide 解释了如何处理此问题

    【讨论】:

      【解决方案3】:

      你的新反应很糟糕。解析那种 JSON 是不可能的。

      它表示不同对象(不同类型)的数组。所以,GSON 什么都做不了,你必须创建一个类,相当于整个响应。

      您的第一个 JSON 响应很好。

      【讨论】:

        猜你喜欢
        • 2012-11-27
        • 1970-01-01
        • 2011-02-12
        • 2012-01-02
        • 1970-01-01
        • 2015-07-29
        • 2020-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多