解析retrofit2响应时出错

时间:2016-12-14 12:13:44

标签: android retrofit2 yahoo-api gson

我迷失了我需要改变的地方和内容,以使其发挥作用。

我正在使用this API调用yahoo finance。

这是我的改造实例:

public class ApiClient {
    private static Retrofit retrofit = null;
    private static final String BASE_URL = "https://query.yahooapis.com";

    public static Retrofit getClient(){
        if(retrofit == null){
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

我打电话的地方:

String query = "select * from yahoo.finance.quotes where symbol in (\"YHOO\",\"AAPL\",\"GOOG\",\"2MSFT\")&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=";

YahooApi yahooApi = ApiClient.getClient().create(YahooApi.class);
Call<GetStockResponse> call = yahooApi.getStock(query);

call.enqueue(new Callback<GetStockResponse>() {
    @Override
    public void onResponse(Call<GetStockResponse> call, Response<GetStockResponse> response) {
        List<Stock> list = response.body().getQuery().getResults().getList();
        if(list!=null)
            Toast.makeText(getContext(), list.size(), Toast.LENGTH_LONG).show();
    }

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

    }
});

界面(YahooApi):

@GET("v1/public/yql")
Call<GetStockResponse> getStock(@Query("q") String query);

基于我回来的JSON对象,我做了以下包装类:

public class GetStockResponse {
    @SerializedName("query")
    @Expose
    private Query mQuery;

    public Query getQuery(){
        return mQuery;
    }
}


public class Query {
    @SerializedName("count")
    @Expose
    private String mCount;
    @SerializedName("results")
    @Expose
    private Result mResults;

    public String getCount(){
        return mCount;
    }

    public Result getResults(){
        return mResults;
    }
}

public class Result {
    @SerializedName("quote")
    @Expose
    private List<Stock> mList;

    public List<Stock> getList(){
        return mList;
    }
}

public class Stock {
    @SerializedName("symbol")
    @Expose
    private String mSymbol;
    @SerializedName("Bid")
    @Expose
    private String mBid;
    @SerializedName("Change")
    @Expose
    private String mChange;
    @SerializedName("PercentChange")
    @Expose
    private String mPercentChange;
    @SerializedName("Name")
    @Expose
    private String mName;

    public String getSymbol(){
        return mSymbol;
    }

    public String getBid(){
        return mBid;
    }
    public String getChange(){
        return mChange;
    }

    public String getPercentChange(){
        return mPercentChange;
    }

    public String getName(){
        return mName;
    }
}

我将非常感谢有关我需要改变的任何信息!

编辑*添加了错误消息:

   java.lang.NullPointerException: Attempt to invoke virtual method 'strahinja.udacity.com.stockhawk.model.Query strahinja.udacity.com.stockhawk.model.GetStockResponse.getQuery()' on a null object reference
             at strahinja.udacity.com.stockhawk.fragment.MainFragment$1.onResponse(MainFragment.java:64)
             at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
             at android.os.Handler.handleCallback(Handler.java:739)
             at android.os.Handler.dispatchMessage(Handler.java:95)
             at android.os.Looper.loop(Looper.java:158)
             at android.app.ActivityThread.main(ActivityThread.java:7229)
             at java.lang.reflect.Method.invoke(Native Method)
             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

当我检查回复时,返回的网址已更改为:

https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22,%22AAPL%22,%22GOOG%22,%222MSFT%22)%26format%3Djson%26diagnostics%3Dtrue%26env%3Dstore%253A%252F%252Fdatatables.org%252Falltableswithkeys%26callback%3D

这就是我能找到的所有内容。

1 个答案:

答案 0 :(得分:1)

将您的查询更改为以下(关键问题是您拥有的原始查询字符串还包含其他查询参数)

String query = "select * from yahoo.finance.quote where symbol in (\"YHOO\",\"AAPL\",\"GOOG\",\"MSFT\")";

请注意,我还将改装界面更改为以下测试,但如果需要,可以将其他参数设置为动态

    @GET("v1/public/yql?format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=")
    Call<GetStockResponse> getStock(@Query("q") String query);