gpt4 book ai didi

java - 应为 BEGIN_OBJECT,但经过改造后为 BEGIN_ARRAY

转载 作者:行者123 更新时间:2023-12-01 19:08:15 25 4
gpt4 key购买 nike

如何使用 Retrofit 解析此内容?我收到错误

BEGIN_OBJECT but was BEGIN_ARRAY

Json 如下,它包含一个结果数组对象,该对象有一个为 null 的数组对象和信息对象。看来 null 数组就是问题所在,如果可以解决的话,我需要一些帮助来解决这个问题?

{
"error": "OK",
"limit": 100,
"offset": 0,
"number_of_page_results": 16,
"number_of_total_results": "16",
"status_code": 1,
"results": [
[],
{
"api_detail_url"............

模型类:

 public class Response {

@SerializedName("results")
List<IssuesResults> resultList;

public Response(ArrayList<IssuesResults> resultList) {
this.resultList = resultList;
}

public List<IssuesResults> getResultList() {
return resultList;
}
}

API

@GET("promos/")
Call<Response> getPromos(@Query("api_key") String API_KEY,
@Query("format") String format);

repo 协议(protocol)

public MutableLiveData<List<IssuesResults>> getPromos() {

callApi.getPromos(API_KEY,"json").enqueue(new Callback<Response>() {
@Override
public void onResponse(Call<Response> call,
retrofit2.Response<Response> response) {
promosMutableData.setValue(response.body().getResultList());

}

@Override
public void onFailure(Call<Response> call, Throwable t) {
Log.d("PROMOS", "onFailure: " + t);
}
});

return promosMutableData;
}

最佳答案

我假设您使用默认设置的 Gson。您的问题是您期望一个 IssuesResults 列表,但它包含这个额外的数组,这意味着它 - 默认情况下 - 仅可序列化为对象列表,然后该对象列表将是一个数组和 N 个映射作为项目。

对于此类内容,您需要一些自定义处理,我在这里提供一个选项,即 JsonDeserializer。我需要进行一些更改以使事情变得更容易((它们并不是其他方法的全部必需品,但对于这个解决方案,我使用这些))。首先而不是内联类型列表实现类,例如:

@SuppressWarnings("serial")
public static class ListIssuesResults extends ArrayList<IssuesResults> {
// This override is not needed if you do not mind null values in your resulting list
@Override
public boolean add(IssuesResults e) {
if (null != e) {
return super.add(e);
}
return false;
}
}

更改响应,例如:

public static class Response {
@SerializedName("results")
private ListIssuesResults resultList;
// other stuff
}

然后是实际的自定义JsonDeserializer:

public static class IssuesResultsDeserializer implements JsonDeserializer<IssuesResults> {
// this you need to not to cause recursion and stack overflow
private static final Gson GSON = new Gson();
@Override
public IssuesResults deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
// this is the trick. if it fails to serialize stuff like [] jsut return null
try {
return GSON.fromJson(json, typeOfT);
} catch (Exception ise) {
return null;
}
}
}

要使用自定义反序列化器,您需要像这样注册它:

new GsonBuilder().registerTypeAdapter(IssuesResults.class,
new IssuesResultsDeserializer()).create();

这必须在 Retrofit 客户端构建阶段完成,如下所示:How to register custom TypeAdapter or JsonDeserializer with Gson in Retrofit?

关于java - 应为 BEGIN_OBJECT,但经过改造后为 BEGIN_ARRAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59511907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com