gson 无法理解如何将JSONMap/转换为Java对象

fzwojiic  于 2022-11-06  发布在  Java
关注(0)|答案(1)|浏览(157)

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,它帮了我一点忙,但我仍然不知道我该如何组织列表。

  1. protected void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_main);
  4. String URL = "https://api.openweathermap.org/data/2.5/air_pollution?lat=50&lon=50&appid=0140f9110ece5d6477b5ac95aba2020d";
  5. //create a request queue
  6. RequestQueue requestQueue = Volley.newRequestQueue(this);
  7. // construct request
  8. //you can use json array or json object request or string request
  9. JsonObjectRequest objectRequest = new JsonObjectRequest(
  10. Request.Method.GET,
  11. URL,
  12. null,
  13. new Response.Listener<JSONObject>() {
  14. @Override
  15. public void onResponse(JSONObject response) {
  16. Log.e("Reponse", response.toString());
  17. String json = response.toString();
  18. JsonObject convertedObject = new Gson().fromJson(json, JsonObject.class);
  19. Gson gson = new GsonBuilder().setPrettyPrinting().create(); // pretty print
  20. String prettyJson = gson.toJson(json);
  21. System.out.println(prettyJson);
  22. //JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
  23. //Assert.assertTrue(jsonObject.isJsonObject());
  24. //Assert.assertTrue(convertedObject.isJsonObject());
  25. //Assert.assertTrue(convertedObject.get("coord").getAsString().equals("lon"));
  26. }
  27. },
  28. new Response.ErrorListener() {
  29. @Override
  30. public void onErrorResponse(VolleyError error) {
  31. Log.e("Reponse", error.toString());
  32. }
  33. }
  34. );
  35. requestQueue.add(objectRequest);
  36. }

空气污染类(不是它将如何在所有只是一个大概的想法,我应该做什么?)

  1. public class airPollution {
  2. private String coord;
  3. private String lon;
  4. private String lat;
  5. public String getCoord() {
  6. return coord;
  7. }
  8. public void setCoord(String coord) {
  9. this.coord = coord;
  10. }
  11. public String getLon() {
  12. return lon;
  13. }
  14. public void setLon(String lon) {
  15. this.lon = lon;
  16. }
  17. public String getLat() {
  18. return lat;
  19. }
  20. public void setLat(String lat) {
  21. this.lat = lat;
  22. }
  23. }
xzlaal3s

xzlaal3s1#

您需要传递所期望的class,否则它将不知道它是什么:

  1. AirPollution convertedObject = new Gson().fromJson(json, AirPollutionResponse.class);

虽然class AirPollution可能需要或不需要进一步的代码注解...这取决于字段名称是否与输入JSON字段名称匹配。在Android模型类中,通常会有很多注解,例如在Retrofit(内部使用GSON)和Room中使用它们时。
另请参阅GSON user guide
该模型类与输入JSON一点也不匹配......因为阅读带有一个信封。

  1. {
  2. "coord": {
  3. "lon": 50,
  4. "lat": 50
  5. },
  6. "list": [{
  7. "main":{
  8. "aqi": 1
  9. },
  10. "components":{
  11. "co": 267.03,
  12. "no": 0,
  13. "no2": 0.47,
  14. "o3": 76.53,
  15. "so2": 1.65,
  16. "pm2_5": 0.87,
  17. "pm10": 3.09,
  18. "nh3": 0.07
  19. },
  20. "dt": 1640437200
  21. }]
  22. }

现在被删除的答案并没有错,因为这需要5个Java类来Map。
AirPollution类:

  1. import com.google.gson.annotations.SerializedName;
  2. public class AirPollution {
  3. @SerializedName("co")
  4. private Double carbonMonoxide = 0.0;
  5. @SerializedName("no")
  6. private Double nitricOxide = 0.0;
  7. @SerializedName("no2")
  8. private Double nitrogenDioxide = 0.0;
  9. @SerializedName("o3")
  10. private Double ozone = 0.0;
  11. @SerializedName("so2")
  12. private Double sulfurDioxide = 0.0;
  13. @SerializedName("pm2_5")
  14. private Double particulateMatterTwoFive = 0.0;
  15. @SerializedName("pm10")
  16. private Double particulateMatterTen = 0.0;
  17. @SerializedName("nh3")
  18. private Double ammonia = 0.0;
  19. ...
  20. }

class List Package (实际上并不是一个列表):

  1. public class List {
  2. @SerializedName("dt")
  3. private int timestamp = 0;
  4. @SerializedName("components")
  5. private AirPollution reading = null;
  6. ...
  7. }

class AirPollutionResponse Package :

  1. public class AirPollutionResponse {
  2. @SerializedName("list")
  3. private List list = null;
  4. ...
  5. }

AirPollution上的其他字段(如dtlatlng)将需要手动设置。
尽管可以Map嵌套类,但类只能Map一维。
当嵌套变得过于极端时,仍然可以为嵌套值添加getter。

展开查看全部

相关问题