我试图使用改型在一些解析的JSON上执行一些代码,但是我得到了一个非法的状态异常。以下是我的改装实例:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.pro.coinbase.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
CoinbaseProAPI coinbaseProAPI = retrofit.create(CoinbaseProAPI.class);
Coinbase Pro API接口:
@GET("products/{productId}/candles")
Call<ArrayList<HistoricRates>> getHistoricRates(@Header("CB-ACCESS-SIGN") String signature,
@Header("CB-ACCESS-TIMESTAMP") String timeStamp,
@Path("productId") String productId,
@Query("start") String intervalStart,
@Query("end") String intervalEnd,
@Query("granularity") int granularity
);
对服务器的调用请求(这是导致错误的原因):
Call<ArrayList<HistoricRates>> call = coinbaseProAPI.getHistoricRates(signature, timeStamp, productId, intervalStart, intervalEnd, granularity);
try {
//this is being executed inside a for loop; requests are rate limited so consecutive
//iterations must wait
if (i > 0) {
call.wait(1010);
}
//this is the line the debugger doesn't like:
Response<ArrayList<HistoricRates>> response = call.execute();
if (!response.isSuccessful()) {
Message eMsg = errorHandler.obtainMessage();
String e = R.string.error_header + response.toString();
eMsg.what = 2;
eMsg.obj = e;
errorHandler.sendMessage(eMsg);
} else {
ArrayList<HistoricRates> candles = response.body();
int n = 0;
double[][] aCandles = new double[3][3];
for (HistoricRates historicRates : candles) {
aCandles[n][0] = historicRates.getOpen();
aCandles[n][1] = historicRates.getClose();
aCandles[n][2] = historicRates.getVolume();
n++;
}
selectedAsset.setCandles(aCandles);
}
} catch (Exception e) {
Message eMsg = errorHandler.obtainMessage();
eMsg.what = 2;
eMsg.obj = e.getMessage();
errorHandler.sendMessage(eMsg);
e.printStackTrace();
}
最后是JSON解析成的类对象:
public class HistoricRates {
private int time;
private double low;
private double high;
private double open;
private double close;
private double volume;
public double getOpen() {
return open;
}
public double getClose() {
return close;
}
public double getVolume() {
return volume;
}
}
因此,根据我从类似文章中收集的信息,发生非法状态异常是因为我试图传递给Gson的对象的类型不正确。但我不明白这是怎么回事,因为我正在使用改装;GsonConverterFactory不应该帮我处理这个吗?此外,即使我将此代码封装在try/catch块中,它实际上并没有抛出异常;它只是默默地失败了。我知道非法状态异常的唯一原因是调试控制台。我如何改进我的错误报告,或者是否有其他我不了解的地方?
编辑添加:尝试了Capps99的解决方案(添加的访问器方法包含在历史RatesList中,这样我就可以得到一个迭代器来循环遍历这些值)以下是它的样子:
HistoricRatesList candles = response.body();
Iterator candleIterator = candles.getList().iterator();
int n = 0;
double[][] aCandles = new double[3][3];
while (candleIterator.hasNext()) {
HistoricRates historicRates = (HistoricRates) candleIterator.next();
aCandles[n][0] = historicRates.getOpen();
aCandles[n][1] = historicRates.getClose();
aCandles[n][2] = historicRates.getVolume();
n++;
}
不幸的是,我仍然得到一个非法国家例外。应另一位评论者的要求,以下是来自服务器的预期JSON响应(抱歉,我应该在开始时包含这个):
[
//these are all decimal values except for time; which is an integer value
//representing the UNIX epoch time
[time, low, high, open, close, volume],
[time, low, high, open, close, volume],
...
]
可能问题在于服务器似乎以2D数组的形式返回数据,我没有经验知道如何正确解析。
试试这个。
创建以下类以解析列表。
public class HistoricRatesList {
List<HistoricRates> historicRates;
}
然后像这样使用。
@GET("products/{productId}/candles")
Call<HistoricRatesList> getHistoricRates(@Header("CB-ACCESS-SIGN") String signature,
@Header("CB-ACCESS-TIMESTAMP") String timeStamp,
@Path("productId") String productId,
@Query("start") String intervalStart,
@Query("end") String intervalEnd,
@Query("granularity") int granularity
);
我每次都会收到这个错误:预期的begin_数组,但它是begin_对象。我不知道我是否需要添加反序列化程序或warrper类来进行改造,但我不知道如何以简单的方式来满足我所有项目的api json响应,下面是我的改造代码: - 我的Json: 我的源代码
我做了一个功能:输入身份证号码,点击提交按钮,然后获得身份证的基本信息。 我使用的模型是: 我使用的改装界面: 当我输入正确的身份证号码时,一切正常。返回的结果是: 一切运作良好。 然而,当我输入不正确的身份证号码时,不好的事情发生了: 返回的结果是: 我怎样才能修复这些漏洞?
我不熟悉GSON和改装,这是我的输出模型(仅供参考结构), 这是我的输出 这是我的改装代码 应为BEGIN_对象,但为BEGIN_数组“ 我尝试过用List替换RootObject
我正在通过改型和RXAndroid与来自android的REST API进行交互,我遇到了一个问题。 当我向我的“api/users/{id}/{id}/classes”发送GET请求时,我的api会以用户类列表作出响应,如下所示: 我的界面如下所示: 我从片段中这样称呼它: 我的类对象以及getter和setter如下所示: gson不应该看到“类”:[]数组并从中解析对象吗?我做错了什么
问题内容: 我是JSON解析的新手,我使用Square的Retrofit库,遇到了这个问题。 我正在尝试解析此JSON响应: 这是我的模型: … 我的界面: 我的成功方法: 当我将其用于成功方法时,会引发错误 预期为BEGIN_OBJECT,但在第1行column2处为BEGIN_ARRAY 怎么了 问题答案: 现在,您正在解析响应,就好像它是这样格式化的: 异常告诉您,您期望在根目录有一个对象,
我有一个JSON对象,如下所示: