在 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 或 GSON 库通过模型类快速解析 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 数组中获取价值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Kotlin 中的 gson 访问嵌套 JSON 中的值?
Kotlin中实现RecyclerView嵌套RecyclerView