在 Android 上通过 GSON 从嵌套 JSON 数组中获取价值? [复制]

Posted

技术标签:

【中文标题】在 Android 上通过 GSON 从嵌套 JSON 数组中获取价值? [复制]【英文标题】:Getting value from nested JSON Array via GSON on Android? [duplicate] 【发布时间】:2021-03-20 12:51:45 【问题描述】:

上下文:我无法从 OpenWeatherMap 的 API 通过 android 返回的 JSON 中获取值。

我的 JSON 如下所示:

"coord":"lon":-78.32,"lat":38.55,"weather":["id":802,"main":"Clouds","description":"scattered clouds","icon":"03n"],"base":"stations","main":"temp":269.05,"feels_like":265.34,"temp_min":267.59,"temp_max":270.37,"pressure":1010,"humidity":78,"visibility":10000,"wind":"speed":1.25,"deg":293,"clouds":"all":25,"dt":1607493640,"sys":"type":3,"id":2006561,"country":"US","sunrise":1607516385,"sunset":1607550737,"timezone":-18000,"id":4744896,"name":"Ashbys Corner","cod":200

它存储在来自如下 URL 的 JsonObject(GSON 的一部分,不要与 JSONObject 混淆)中:

URLConnection requestWeather = weatherUrl.openConnection();
requestWeather.connect(); // connect to the recently opened connection to the OpenWeatherMaps URL
JsonElement parsedJSON = JsonParser.parseReader(new InputStreamReader((InputStream) requestWeather.getContent())); //Convert the input stream of the URL into JSON
JsonObject fetchedJSON = parsedJSON.getAsJsonObject(); // Store the result of the parsed json locally as a json object

问题:我想从 JSON 中获取与 "main" 关联的值(在本例中应该是“Clouds”)。

尝试的解决方案:我试图像这样获取 main 的值:

String weatherType = fetchedJSON.get("weather").getAsString();

但这会引发java.lang.UnsupportedOperationException: JsonObject 异常。

问题:如何获得"main"的值?

【问题讨论】:

main 是一个 JsonObject 本身,首先你使用 JsonObject main =fetchedJSON.getAsJsonObject("main") 获得 main ,然后你可以获得 main 的内部属性。如果你使用 Gson,为什么还要手动解析? 嗯,如果“main”嵌套在“weather”中,我可以在“main”上调用“getAsJsonObject”吗? 老实说,我发现你所链接的问题的答案有点令人困惑。 我觉得更令人困惑的是,这个问题与 GSON 没有丝毫关系。 它使用 GSON 方法/对象,如“JsonElement、JsonObject、JsonParser”等。我怀疑 GSON 的各种 get 方法之一是解决我的问题的方法。 【参考方案1】:

您可以使用 JACKSON 或 GS​​ON 库通过模型类快速解析 Json 数据。 JACKSON 和 GSON 专用于处理(序列化/反序列化)JSON 数据。

通过 GSON 进行原始解析

JsonObject fetchedJSON = parsedJSON.getAsJsonObject();
//weather is an array so get it as array not as string
JsonArray jarray = fetchedJSON.getAsJsonArray("weather");
// OR you use loop if you want all main data
jobject = jarray.get(0).getAsJsonObject();
String main= jobject.get("main").getAsString();

虽然如果你想要原始解析,那么你可以这样做::

JSONObject obj = new JSONObject(yourString);

JSONArray weather = obj.getJSONArray("weather");
for (int i = 0; i < arr.length(); i++)

String main= arr.getJSONObject(i).getString("main");
......

【讨论】:

正如我在问题中所说,我已经在使用 GSON。您知道通过 GSON 的方法从 JSON 中获取“main”值的方法吗? @PrithviBoinpally 立即查看 JSONObject 与 GSON 无关。问题和答案都没有使用它。最好将 GSON 与 ORM 一起使用,并跳过所有手动操作......并改为映射它。 @MartinZeitler 是的..我知道 JSONObject 与 GSON 无关,这就是为什么我编写原始解析并编写 JACKSON 和 GSON 库以使用模型类 (ORM) 快速解析 Json 数据。 @PrithviBoinpally 我还用 JsonObject (GSON) 给出了答案。我刚刚写了另一个用 JSONObject 解析 json 数据的选项。

以上是关于在 Android 上通过 GSON 从嵌套 JSON 数组中获取价值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Android安卓Gson解析带二级跳转

如何通过 Kotlin 中的 gson 访问嵌套 JSON 中的值?

Kotlin中实现RecyclerView嵌套RecyclerView

使用改造获取带有 GSON 的嵌套 JSON 对象

如何通过 gson 将 json 反序列化为嵌套的自定义地图?

由于嵌套 bean,无法在 playframework 中使用 GSON 解析 JSON