2016-12-14 87 views
0

我失去了我需要更改的位置和内容才能使其工作。解析retrofit2响应时出错

我正在使用this针对雅虎财务的API调用。

这是我的改装实例:

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 

这就是一切,我已经能够找出。

+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); 
+0

我已经做了你所建议的改变,但无济于事。如果你有时间看看,我在github上添加了一个链接到我的代码。无论如何,请多多关照! https://github.com/strahinjaajvaz/StockHawk –

+0

远离笔记本电脑,但你测试了生成的网址(在浏览器中)? –

+0

看起来像'查询'没有在你的代码中设置? –