预期为BEGIN_ARRAY,但被BEGIN_OBJECT进行了翻新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了预期为BEGIN_ARRAY,但被BEGIN_OBJECT进行了翻新相关的知识,希望对你有一定的参考价值。

所以我正在尝试从电晕api加载数据。

这是我的界面:

public interface RKIApi {

String BASE_URL = "https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/";

@Headers("Content-Type: application/json")
@GET("query?where=1%3D1&outFields=cases,deaths,cases_per_population,county,death_rate&returnGeometry=false&outSR=4326&f=json")
Call<List<County>> getCounties();
}

这是我希望将收到的数据转换为我的县数据类:

public class County {

@SerializedName("county")
@Expose
private String county;

@SerializedName("cases")
@Expose
private int cases;

@SerializedName("deaths")
@Expose
private int deaths;

@SerializedName("cases_per_population")
@Expose
private float casesPerPopulation;

@SerializedName("death_rate")
@Expose
private float deathRate;

public County(String county, int cases, int deaths, float casesPerPopulation, float deathRate) {
    this.county = county;
    this.cases = cases;
    this.deaths = deaths;
    this.casesPerPopulation = casesPerPopulation;
    this.deathRate = deathRate;
}

... Getter和Setters ....

这就是我试图加载数据的方式:

Retrofit retrofit = new Retrofit.Builder().baseUrl(RKIApi.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();

    RKIApi apiService = retrofit.create(RKIApi.class);

    Call<List<County>> call = apiService.getCounties();

    call.enqueue(new Callback<List<County>>() {
        @Override
        public void onResponse(@NonNull Call<List<County>> call,@NonNull Response<List<County>> response) {
            ... Do something ...
        }

        @Override
        public void onFailure(@NonNull Call<List<County>> call,@NonNull Throwable t) {
            System.out.println("========== ERROR ==========");
            System.out.println(t.getMessage());
        }
    });

但是,当我尝试在启用调试器的情况下打开应用程序时,得到的所有内容都是BEGIN_ARRAY,但在第1行第2列路径$处是BEGIN_OBJECT。现在这显然是因为JSON并非以县列表开头,但是我只想加载它们。我已尝试使用如上所述的Expose标签,但仍无法正常工作。

非常感谢任何帮助:)

答案

错误的原因和原因是设计错误的API或错误解释的api。您的api没有发送对象列表。API很可能会像这样吐出JSON:

 { ...content }

不是对象列表,而是单个对象。改造期望这样的事情:

 [ { ....content } ]

[表示对象和数组。因此,为了解决这个问题,您有2个选择。要么更改api,否则即使对于像[]这样的空列表,还是对于像[{ one object }]

这样的单个结果,它都将始终返回方括号。

要么手动解析您的结果。请在这里在stackoverflow上检查此问题:

Manually parse part of a response when using Retrofit

以上是关于预期为BEGIN_ARRAY,但被BEGIN_OBJECT进行了翻新的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 字符串转换为对象返回“预期的 BEGIN_ARRAY 但为字符串”[重复]

使用 Retrofit 将 JsonArray 转换为 Kotlin 数据类(预期为 BEGIN_OBJECT 但为 BEGIN_ARRAY)

AsyncTask 预期为 BEGIN_OBJECT,但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY

预期为 BEGIN_ARRAY,但在第 1 行第 2 列改造时为 BEGIN_OBJECT2

Retrofit2:预期为 BEGIN_ARRAY,但在第 1 行第 268 列路径 $[0].images 处为 STRING

获得错误预期BEGIN_ARRAY但在第1行第2列路径$是BEGIN_OBJECT