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

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

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;
    }
}
xzlaal3s

xzlaal3s1#

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

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

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

{
    "coord": {
        "lon": 50,
        "lat": 50
    },
    "list": [{
        "main":{
            "aqi": 1
        },
        "components":{
            "co": 267.03,
            "no": 0,
            "no2": 0.47,
            "o3": 76.53,
            "so2": 1.65,
            "pm2_5": 0.87,
            "pm10": 3.09,
            "nh3": 0.07
        },
        "dt": 1640437200
    }]
}

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

import com.google.gson.annotations.SerializedName;

public class AirPollution {

    @SerializedName("co")
    private Double carbonMonoxide = 0.0;

    @SerializedName("no")
    private Double nitricOxide = 0.0;

    @SerializedName("no2")
    private Double nitrogenDioxide = 0.0;

    @SerializedName("o3")
    private Double ozone = 0.0;

    @SerializedName("so2")
    private Double sulfurDioxide = 0.0;

    @SerializedName("pm2_5")
    private Double particulateMatterTwoFive = 0.0;

    @SerializedName("pm10")
    private Double particulateMatterTen = 0.0;

    @SerializedName("nh3")
    private Double ammonia = 0.0;
    ...
}

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

public class List {

    @SerializedName("dt")
    private int timestamp = 0;    

    @SerializedName("components")
    private AirPollution reading = null;
    ...
}

class AirPollutionResponse Package :

public class AirPollutionResponse {

    @SerializedName("list")
    private List list = null;
    ...
}

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

相关问题