【问题标题】:android - using retrofit to get data, but not parse into objectandroid - 使用改造来获取数据,但不解析成对象
【发布时间】:2016-03-28 14:00:55
【问题描述】:

我是 Retrofit 的新手。我正在尝试使用 Retrofit 查询 OpenWeatherMap 并返回一些天气数据。

这是我的一些代码:

public static void getCurForecast(final Resources resources, final String zipCode, final String countryCode, final ForecastListener listener) {
        new AsyncTask<Void, Void, CurForecastResponse>() {

            @Override
            protected CurForecastResponse doInBackground(Void... params) {
                Log.d("TAG","in CurForecastResponse");
                RestAdapter restAdapter = new RestAdapter.Builder()
                        .setEndpoint("http://api.openweathermap.org")
                        .build();
                //String zipCode = "78613";
                //String countryCode = "us";
                ForecastRequest service = restAdapter.create(ForecastRequest.class);
                try {
                    String zipCodeFormat = zipCode + ",us";
                    Log.d("TAG","zipCodeFormat: " + zipCodeFormat);
                    CurForecastResponse temp = service.getCurForecast(zipCodeFormat, resources.getString(R.string.open_weather_api_key));
                    if(temp == null){
                        Log.d("TAG","TEMP = NULL!");
                    }
                    else {
                        Log.d("TAG","Weather: " + temp.name);
                    }
                    return temp;//service.getCurForecast(zipCodeFormat, resources.getString(R.string.open_weather_api_key));
                } catch (RetrofitError error) {
                    Log.w("ForecastModule", "Forecast error: " + error.getMessage());
                    return null;
                }
            };

这是 JSON 对象的一部分:

public class CurForecastResponse {

    public int cod;
    public String base;
    public String name;
    public ForecastCurrently currently;
    public ForecastHourly hourly;
    public Weather main;

    public CurForecastResponse() {
        Log.d("TAG","CurForecastResponse Constructor");
    }
    public class weather {
        int id;
        String main;
        String description;
        String icon;
        public weather(int id, String main, String description, String icon) {
        this.id = id;
        this.main = main;
        this.description = description;
        this.icon = icon;
    }
        public int getId() {return id; }
        public String getDescription() {return description; }
        public String getIcon() {return icon; }
        public String getMain() {return main; }
    }

这是 ForecastRequest 类

public interface ForecastRequest {

    //Open Weather Forecast API
    @GET("/data/2.5/weather?")
    CurForecastResponse getCurForecast(@Query("zip") String zipCode,
                                       @Query("apiKey") String apiKey);
}

这是 JSON 响应的示例

    {"coord":{"lon":145.77,"lat":-16.92},
"weather":[{"id":801,"main":"Clouds","description":"few clouds","icon":"02d"}],
"base":"cmc stations",
"main":{"temp":305.15,"pressure":1013,"humidity":52,"temp_min":305.15,"temp_max":305.15},"wind":{"speed":5.7,"deg":40},"clouds":{"all":20},"dt":1459137600,"sys":{"type":1,"id":8166,"message":0.0092,"country":"AU","sunrise":1459110134,"sunset":1459153277},"id":2172797,"name":"Cairns","cod":200}

我在将数据输入天气类时遇到了一些问题。

【问题讨论】:

  • 请说明您正在使用的改造版本。
  • 我使用的版本是v1.9
  • 必须为要放入的数据创建一个数组.. duh...
  • 必须为我的对象创建一个数组才能进入。see

标签: java android json retrofit


【解决方案1】:

在 Retrofit2 中,你应该用 call 包装你的返回值。

调用实例可以同步或异步执行。 每个实例只能使用一次,但调用 clone() 将创建一个 可以使用的新实例。

来自其 github 存储库的快速示例是:

public final class SimpleService {

 public static final String API_URL = "https://api.github.com";

  public static class Contributor {
    public final String login;
    public final int contributions;

    public Contributor(String login, int contributions) {
      this.login = login;
      this.contributions = contributions;
    }
  }

  public interface GitHub {
    @GET("/repos/{owner}/{repo}/contributors")
    Call<List<Contributor>> contributors(
        @Path("owner") String owner,
        @Path("repo") String repo);
  }

  public static void main(String... args) throws IOException {
    // Create a very simple REST adapter which points the GitHub API.
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(API_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

    // Create an instance of our GitHub API interface.
    GitHub github = retrofit.create(GitHub.class);

    // Create a call instance for looking up Retrofit contributors.
    Call<List<Contributor>> call = github.contributors("square", "retrofit");

    // Fetch and print a list of the contributors to the library.
    List<Contributor> contributors = call.execute().body();
    for (Contributor contributor : contributors) {
      System.out.println(contributor.login + " (" + contributor.contributions + ")");
    }
  }
}

注意这一行:

 List<Contributor> contributors = call.execute().body();

运行synchronously。对于asynchronous 调用,使用call.enqueue 并覆盖回调方法。

【讨论】:

    【解决方案2】:

    根据 json 响应

      {
        "coord": {
            "lon": 145.77,
            "lat": -16.92
        },
        "weather": [{
            "id": 801,
            "main": "Clouds",
            "description": "few clouds",
            "icon": "02d"
        }],
        "base": "cmc stations",
        "main": {
            "temp": 305.15,
            "pressure": 1013,
            "humidity": 52,
            "temp_min": 305.15,
            "temp_max": 305.15
        },
        "wind": {
            "speed": 5.7,
            "deg": 40
        },
        "clouds": {
            "all": 20
        },
        "dt": 1459137600,
        "sys": {
            "type": 1,
            "id": 8166,
            "message": 0.0092,
            "country": "AU",
            "sunrise": 1459110134,
            "sunset": 1459153277
        },
        "id": 2172797,
        "name": "Cairns",
        "cod": 200
      }
    

    你的pojo类(Model类)应该是这样的

    public class CurForecastResponse {
    
        public Coord coord;
        public List<Weather> weather;
        public String base;
        public Main main;
        public Wind wind;
        public Clouds clouds;
        public double dt;
        public Sys sys;
        public int id;
        public String name;
        public int cod;
    
        public CurForecastResponse() {
            Log.d("TAG", "CurForecastResponse Constructor");
        }
    
        public class Coord {
            public double lon;
            public double lat;
        }
    
        public class Weather {
            public int id;
            public String main;
            public String description;
            public String icon;
        }
    
        public class Main {
            public double temp;
            public double pressure;
            public double humidity;
            public double temp_min;
            public double temp_max;
        }
    
        public class Wind{
            public double speed;
            public double deg;
        }
    
        public class Clouds{
            public double all;
        }
    
        public class Sys{
            public int type;
            public int id;
            public double message;
            public String country;
            public int sunrise;
            public int sunset;
        }
    }
    

    你可以在里面使用 setter 和 getter

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 2017-05-12
      • 1970-01-01
      • 2020-10-18
      • 2014-10-16
      • 2019-11-11
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      相关资源
      最近更新 更多