0

我是 json 解析的新手,最近我一直在使用改造从服务器检索数据,如下所示:

[
    [ time, low, high, open, close, volume ],
    [ 1415398768, 0.32, 4.2, 0.35, 4.2, 12.3 ],
    ...
]

我的对象类是

import java.util.List;


public class cbProducts {
    List<String> data;

    public cbProducts(List<String> data) {
        this.data = data;

    }
}

我的界面

public interface cbClient {

    @GET("/products/BTC-USD/candles")
    Call<List<cbProducts>> Authenticate(
            @Header("CB-ACCESS-KEY") String key,
            @Header("CB-ACCESS-SIGN") String sign,
            @Header("CB-ACCESS-TIMESTAMP") String timestamp,
            @Header("CB-ACCESS-PASSPHRASE") String passphrase,
            @Query("start") String startTime,
            @Query("end") String endTime,
            @Query("granularity") String granularity
    ) ;

}

我的回应

Retrofit.Builder builder = new Retrofit.Builder()
                    .baseUrl("https://api.pro.coinbase.com")
                    .addConverterFactory(GsonConverterFactory.create());
            Retrofit retrofit = builder.build();
            cbClient client = retrofit.create(cbClient.class);

            Call<List<cbProducts>> call = client.Authenticate("XXXX","XXXX","XXXX","XXXX","XXXX","XXXX","XXXX"); 

            call.enqueue(new Callback<List<cbProducts>>() {
                @Override
                public void onResponse(Call<List<cbProducts>> call, Response<List<cbProducts>> response) {
                    //cbProducts[] cbP = new Gson().fromJson(String.valueOf(response), (Type) cbProducts[].class);
                    Gson gson = new Gson();
                    cbProducts cb = gson.fromJson(String.valueOf(response),cbProducts.class);
                    Log.d("MESSAGE",cb.toString());
                    Log.d("MESSAGE", String.valueOf(response.code()));


                }

                @Override
                public void onFailure(Call<List<cbProducts>> call, Throwable t) {
                    Log.d("MESSAGE", t.getMessage());

                }
            });

我不断收到相同的错误读数Expected BEGIN_OBJECT but was BEGIN_ARRAY。我不明白为什么当我尝试接收数组时 java 需要一个 Json 对象。任何帮助将不胜感激。

4

3 回答 3

0

您不需要再次解析响应,调用 reponse.body() 来List<cbProducts>删除它

Gson gson = new Gson();
cbProducts cb = gson.fromJson(String.valueOf(response),cbProducts.class);
Log.d("MESSAGE",cb.toString());
Log.d("MESSAGE", String.valueOf(response.code()));

并使用

List<cbProducts> products = response.body();
于 2020-06-10T01:12:56.323 回答
0

您需要在列表中定义“时间、低点、高点、开盘、收盘、成交量”。

public class cbProducts {
    ArrayList<GetStrings> data;

    public cbProducts(ArrayList<GetStrings> data) {
        this.data = data;

    }
}

public class GetStrings {
    public String time;
    public String low;
    public String high;
    public String open;
    public String close;
    public String volume ;
}
于 2020-06-10T02:53:17.537 回答
0

更新:而不是试图得到响应

Call<List<cpProduct>>

我可以使用的对象

Call<ResponseBody>

这给了我我正在寻找的回应,但不是我想要的格式。响应看起来像这样

[[1451653200,427.92,432.87,432.24,428.75,242.42695086],[1451649600,432.03,434.57,434.44,432.11,150.14920385],[1451646000,432,434.59,432.31,434.45,73.36127496],[1451642400,432.04,433.31,433.01,432.31,88.69287665],[1451638800,433,434.08,433.57,433.01,36.75628705],[1451635200,432.65,435,434.42,433.56,313.25456653],[1451631600,434.26,436.46,434.26,434.52,124.69371134],[1451628000,432.02,435.99,435.99,434.26,143.48488231],[1451624400,435.41,436.65,436.12,435.99,182.78957629]]

我还意识到响应不是 String 类型的列表。在更改 cbProduct 类以解决该问题后,它仍然给我同样的错误。我的 cbProduct 类现在看起来像:


import java.util.List;


public class cbProducts {
    public List<data> data;

    public cbProducts(List<data> data){
        this.data = data;
    }

    public class data {
        public long time;
        public float low;
        public float high;
        public float open;
        public float close;
        public long volume;

        public data(long time, float low, float high, float open, float close, long volume) {
            this.time = time;
            this.low = low;
            this.high = high;
            this.open = open;
            this.close = close;
            this.volume = volume;

        }


        public float getClose() {
            return close;
        }

        public long getTime() {
            return time;
        }

        public float getLow() {
            return low;
        }

        public float getHigh() {
            return high;
        }

        public float getOpen() {
            return open;
        }

        public long getVolume() {
            return volume;
        }

    }
}

于 2020-06-10T23:46:46.763 回答