如何使用Retrofit 2获取hashmap响应

时间:2017-08-07 17:57:52

标签: android hashmap retrofit2

我正在尝试使用改进2来获取json对象响应。我使用了hashmap,因为键是动态的。这是我的回复课:

public class Countries {

    private Map<String, Model> datas;

    public Map<String, Model> getDatas() {
        return datas;
    }
}

Model类是:

public class Model {

    @SerializedName("country_name")
    private String country_name;
    @SerializedName("continent_name")
    private String continent_name;

    public String getCountry_name() {
        return country_name;
    }

    public String getContinent_name() {
        return continent_name;
    }
}

到目前为止,我已经尝试过这样的回应:

call.enqueue(new Callback<Countries>() {
            @Override
            public void onResponse(Call<Countries> call, Response<Countries> response) {

                Map<String, Model> map = new HashMap<String, Model>();
                map = response.body().getDatas();

                for (String keys: map.keySet()) {
                    // myCode;
                }

            }

            @Override
            public void onFailure(Call<Countries> call, Throwable t) {

            }
        });

发生此错误:

  

java.lang.NullPointerException:尝试调用接口方法   &#39; java.util.Set java.util.Map.keySet()&#39;在空对象引用上

JSON响应如下所示:

{
    "0": {
        "country_name": "Argentina",
        "continent_name": "South America"
    },
    "1": {
        "country_name": "Germany",
        "continent_name": "Europe"
    }
}

那么如何才能在HashMap中获得响应?

2 个答案:

答案 0 :(得分:3)

问题是,当您使用Call<Countries>时,您正在使用Call<Map<String, Model>>。您的回复没有名为“datas”的字段;它只是StringModel个对象的简单地图。

删除Countries类,并使用Map<String, Model>替换网络代码中对它的所有引用。

答案 1 :(得分:2)

您的方法getDatas()重新设置null,因为您没有将数据分配给它。

你应该这样做以获取数据:

map = response.body().datas;

而不是:

map = response.body().getDatas();

您还应该替换此

private Map<String, Model> datas;

public Map<String, Model> datas;

您的代码应如下所示。

call.enqueue(new Callback<Countries>() {
        @Override
        public void onResponse(Call<Countries> call, Response<Countries> response) {

            Map<String, Model> map = new HashMap<String, Model>();
            map = response.body().datas;

            for (String keys: map.keySet()) {
                // myCode;
            }

        }

        @Override
        public void onFailure(Call<Countries> call, Throwable t) {

        }
});