android - 使用 Retrofit2 解析 API 时获取 null

标签 android json parsing retrofit2 api-design

当直接在我的浏览器中输入这个时(删除了 appId)

http://api.openweathermap.org/data/2.5/weather?q=37421&appid=xxxx

我得到了预期的响应

{"coord":{"lon":73,"lat":31.32},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01n"}],"base":"stations","main":{"temp":286.471,"pressure":1007.05,"humidity":86,"temp_min":286.471,"temp_max":286.471,"sea_level":1028.03,"grnd_level":1007.05},"wind":{"speed":3.01,"deg":252.003},"clouds":{"all":0},"dt":1516458282,"sys":{"message":0.0035,"country":"PK","sunrise":1516413964,"sunset":1516451547},"id":1179400,"name":"Chak 247 RB Miani","cod":200}

我只想得到纬度和经度坐标。

这是我的模型

public class CoordObject {
    private String lat;
    private String lon;

    public CoordObject(
            String lat,
            String lon({
        this.lat =lat;
        this.lon =lon;
    }

    public String getLat(){
        return lat;
    }
    public String getLon(){
        return lon;
    }
}

和我的界面

public interface OwmInterface {

@GET("/data/2.5/weather")
Call<CoordObject> getCoord(@Query("q") String zipCode,
                           @Query("appid") String appId);
}

和我的 Activity

 final String BASE_URL = "https://api.openweathermap.org/";
    final String API_KEY_OWM = "xxxx";

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    OwmInterface request = retrofit.create(OwmInterface.class);

    Call<CoordObject> call = request.getCoord(
            "37421",
            API_KEY_OWM
    );

    call.enqueue(new Callback<CoordObject>() {
        @Override
        public void onResponse(Call<CoordObject> call, Response<CoordObject> response){
            CoordObject coordObjectResponse = response.body();
            Toast.makeText(MainActivity.this, coordObjectResponse.getLat(), Toast.LENGTH_LONG).show();
            Toast.makeText(MainActivity.this, coordObjectResponse.getLon(), Toast.LENGTH_LONG).show();
        }

        @Override
        public void onFailure(Call<CoordObject> call, Throwable t) {
                Toast.makeText(MainActivity.this, "failed" +t, Toast.LENGTH_SHORT).show();
            }
    });

我收到回复,但 toast 显示为空。

最佳答案

有一个作为根的对象包含您的CoordObject
您应该再创建一个类:

public class RootObject {

    private CoordObject coord;

    public RootObject(CoordObject coord){
        this.coord = coord
    }

    public CoordObject getCoordinates(){
        return coord;
    }
}

现在你的接口(interface)应该返回一个RootObject:

@GET("/data/2.5/weather")
Call<RootObject> getCoord(@Query("q") String zipCode,
                           @Query("appid") String appId);

还要检查 latlon 是否来自 double 而不是 String

关于android - 使用 Retrofit2 解析 API 时获取 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48357495/

相关文章:

android - Altbeacon 不在 Android 7 上扫描

android - 以编程方式更改 Gingerbread 中的 Actionbar 标题颜色

parsing - 解析 vmstat 输出的有效方法

android - Android 上的 Nfc Forum Type 4 标签

java - Android - 使用 Handler 和 postDelayed 定期运行方法

java - 我应该使用什么java数据结构来对这些数据进行排序?

json - 如何在 Grails 中实现输入 JSON 验证?

java - 如何在 nanohttpd 中发送 JSON 数据作为响应

php - PHP是否可以同时解析多个函数?

parsing - 是什么让 Ometa 与众不同?