当前位置: 首页 > 知识库问答 >
问题:

预计BEGIN_OBJECT,但在使用改装2时BEGIN_ARRAY

微生弘
2023-03-14

我试图使用改型在一些解析的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数组的形式返回数据,我没有经验知道如何正确解析。

共有1个答案

仲孙钊
2023-03-14

试试这个。

创建以下类以解析列表。

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对象,如下所示: