解析 retrofit2 响应时出错
Error when parsing retrofit2 response
我不知道我需要更改哪些地方和哪些内容才能使其正常工作。
我正在使用 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.onResponse(MainFragment.java:64)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.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)
当我检查响应时,返回的 url 更改为:
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
这就是我能找到的所有内容。
将您的查询更改为以下内容(关键问题是您拥有的原始查询字符串还包含其他查询参数)
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);
我不知道我需要更改哪些地方和哪些内容才能使其正常工作。
我正在使用 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.onResponse(MainFragment.java:64)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.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)
当我检查响应时,返回的 url 更改为:
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
这就是我能找到的所有内容。
将您的查询更改为以下内容(关键问题是您拥有的原始查询字符串还包含其他查询参数)
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);