Hello:D我正在尝试从API(openweathermap.org)获取JSON字符串。我已经完成了API调用,并获得了字符串,甚至使用了gson库将其转换为“漂亮”的json格式,但我不明白如何将字符串中的值Map为单独的可访问值。
我在Android Studio IDE中使用Java编写代码:)
下面是原始JSON字符串的外观:{“坐标”:{“离子”:50,“纬度”:50},“列表”:[{“主要”:{“空气质量”:1},“成分”:{“一氧化碳”:267.03,“NO”:0,“NO 2”:0.47,“O 3”:76.53,“SO 2”:1.65,“PM 2_5”:0.87,“PM 10”:3.09,“NH 3”:0.07},“日期”:1640437200}]}
我有一个名为airPollution的独立类,我将初始化它的值,如private String coord等,但我似乎无法弄清楚JSON字符串的复杂性,coord会是一个包含键lon和lat的列表吗?JSON的列表部分也是如此。
下面是当前的代码,它不多:我已经注解了我试图摆弄的东西,如果有什么不清楚的请告诉我。任何指针都很感激,只是想让我理解它:)我也使用了jsonviewer.stack.hu,它帮了我一点忙,但我仍然不知道我该如何组织列表。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String URL = "https://api.openweathermap.org/data/2.5/air_pollution?lat=50&lon=50&appid=0140f9110ece5d6477b5ac95aba2020d";
//create a request queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
// construct request
//you can use json array or json object request or string request
JsonObjectRequest objectRequest = new JsonObjectRequest(
Request.Method.GET,
URL,
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.e("Reponse", response.toString());
String json = response.toString();
JsonObject convertedObject = new Gson().fromJson(json, JsonObject.class);
Gson gson = new GsonBuilder().setPrettyPrinting().create(); // pretty print
String prettyJson = gson.toJson(json);
System.out.println(prettyJson);
//JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
//Assert.assertTrue(jsonObject.isJsonObject());
//Assert.assertTrue(convertedObject.isJsonObject());
//Assert.assertTrue(convertedObject.get("coord").getAsString().equals("lon"));
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("Reponse", error.toString());
}
}
);
requestQueue.add(objectRequest);
}
空气污染类(不是它将如何在所有只是一个大概的想法,我应该做什么?)
public class airPollution {
private String coord;
private String lon;
private String lat;
public String getCoord() {
return coord;
}
public void setCoord(String coord) {
this.coord = coord;
}
public String getLon() {
return lon;
}
public void setLon(String lon) {
this.lon = lon;
}
public String getLat() {
return lat;
}
public void setLat(String lat) {
this.lat = lat;
}
}
1条答案
按热度按时间xzlaal3s1#
您需要传递所期望的
class
,否则它将不知道它是什么:虽然
class AirPollution
可能需要或不需要进一步的代码注解...这取决于字段名称是否与输入JSON字段名称匹配。在Android模型类中,通常会有很多注解,例如在Retrofit(内部使用GSON)和Room中使用它们时。另请参阅GSON user guide。
该模型类与输入JSON一点也不匹配......因为阅读带有一个信封。
现在被删除的答案并没有错,因为这需要5个Java类来Map。
AirPollution
类:用
class List
Package (实际上并不是一个列表):用
class AirPollutionResponse
Package :AirPollution
上的其他字段(如dt
、lat
、lng
)将需要手动设置。尽管可以Map嵌套类,但类只能Map一维。
当嵌套变得过于极端时,仍然可以为嵌套值添加getter。