英文:
Expected BEGIN_ARRAY but was BEGIN_OBJECT with Retrofit
问题
以下是翻译好的内容:
我正试图从冠状病毒 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;
}
// Getters and 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) {
// ... 做一些操作 ...
}
@Override
public void onFailure(@NonNull Call<List<County>> call, @NonNull Throwable t) {
System.out.println("========== ERROR ===========");
System.out.println(t.getMessage());
}
});
然而,当我尝试启用调试器打开应用时,我只得到了“在第1行第2列路径$处预期为BEGIN_ARRAY,但实际为BEGIN_OBJECT”的错误。很明显,这是因为 JSON 不以县列表开头,然而我只想加载它们。我已尝试使用上述所示的 @Expose 标记,然而仍然无效。
非常感谢任何帮助
英文:
So I am trying to load data from the corona api.
This is my interface:
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();
}
This is my county data class to which I wish to convert the data I receive:
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;
}
... Getters and Setters....
And this is how I am trying to load the data:
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());
}
});
However when I try to open the app with the debugger enabled all I get is Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $. Now this is obviously because the JSON doesn't start with the list of counties, I would however only like to load them. I have tried using the Expose Tag as seen above however its still not working.
Any help is very much appreciated
答案1
得分: 1
这意味着您的任何参数为空值或在 JSON 中没有任何内容。假设您解析了 "name"= "pavel",但在 JSON 中它是 "name"=null。
英文:
This means any of your parameter getting null or don't have anything in the json. Suppose you parse "name"= "pavel" but in the json that is "name"=null
答案2
得分: 0
问题和错误的原因可能是由于糟糕设计的 API 或者误解的 API 导致的。您的 API 并没有发送对象列表。很可能 API 返回的 JSON 数据如下:
{ ...内容 }
这不是对象列表,而是单个对象。Retrofit 期望的数据格式如下:
[ { ....County } { ..County }? ]
因为您告诉 Retrofit 返回一个 List<County>
的列表。
其中 [
表示对象数组。所以要修复这个问题,您有两个选择。要么更改 API,即使是空列表也始终返回方括号,像这样 []
,或者对于单个结果返回 [ { 单个对象 } ]
。
要么手动解析您的结果。请在 Stack Overflow 上查看这个问题:
英文:
The problem and reason of the error is either in a bad designed API or in an misinterpreted api. Your api is not sending a List of objects.
Most probably the API is spitting a JSON like this:
{ ...content }
Which is not a list of objects but a Single object.
Retrofit is expecting something like this:
[ { ....County } { ..County }? ]
because You told to retrofit to return a LIST of List<County>
.
Where the [
means an array of Objects.
So in order to fix this You have 2 choices. Either change the api so it will return always the square brackets even for empty List like this []
or this [{ one object }]
for a single result.
Either parse Your results manually. Check please this question here on stackoverflow:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论