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

获取JSONArray时的Retrofit2+Gson IllegalStateException

穆飞星
2023-03-14

我最近才开始使用Registfit+Gson,尽管我四处寻找解决问题的答案,并尝试了几种解决方案,但似乎没有任何效果,反而导致:

[{
    "id": 23545,
    "title": "some title",
    "description": "some description",
    "questions": {
        "text": [{
            "question": "Some question"
        }, {
            "question": "Some other question"
        }],
        "checkbox": [{
            "question": "Some question",
            "options": [{
                "value": "3",
                "correct": "1"
            }, {
                "value": "2",
                "correct": "0"
            }, {
                "value": "1",
                "correct": "0"
            }]
        }]
     }
}]
public class ApiClient {

    public static final String BASE_URL = "http://somewhere.com/";
    private static Retrofit retrofit = null;

    public static Retrofit getClient() {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        }
        return retrofit;
    }

    public static ApiInterface getApiInterface() {
        return getClient().create(ApiInterface.class);
    }

}
public interface ApiInterface {

    @Headers("Content-Type: application/x-www-form-urlencoded")
    @GET("rest/reviews.json")
    Call<Reviews> getReviews(@Header("Cookie") String cookie);

}
public class Reviews {

    private ArrayList<Review> reviews = new ArrayList<>();

    public ArrayList<Review> getReviews() {
        return reviews;
    }

    public void setReviews(ArrayList<Review> reviews) {
       this.reviews = reviews;
    }

}
public class Review {

    @SerializedName("id") private Integer id;
    @SerializedName("title") private String title;
    @SerializedName("description") private String description;
    @SerializedName("questions") private Questions questions;

    public String getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    etc...
}

我发出请求的片段代码...

ArrayList<Review> reviews = new ArrayList<>();

ApiInterface apiInterface = ApiClient.getApiInterface();

Call<Reviews> call = apiInterface.getReviews(cbi.onGetCookie());

call.enqueue(new Callback<Reviews>() {
    @Override
    public void onResponse(Call<Reviews> call, Response<Reviews> response) {
        if(response.isSuccessful()) {
            reviews = response.body().getReviews();
            // pass on to RecyclerView adapter
        } else {
            // handle fail
        }
    }
    @Override
    public void onFailure(Call<Reviews> call, Throwable t) {
        Log.e(TAG, t.toString());
    }
});

以防万一有人感兴趣...

compile 'com.google.code.gson:gson:2.7'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

我理解错误消息,我只是想弄清楚如何让Gson期望JSONArray。我肯定我的错误是显而易见的,但我没有看到或理解它。提前感谢您的帮助!

共有1个答案

苏乐童
2023-03-14

按照下面的方式更改代码,它应该可以工作:

Call<Review []> call = apiInterface.getAppraisals(cbi.onGetCookie());

call.enqueue(new Callback<Review []>() {
    @Override
    public void onResponse(Call<Review []> call, Response<Review[]> response) {
        if(response.isSuccessful()) {
            reviews = response.body();
            // pass on to RecyclerView adapter
        } else {
            // handle fail
        }
    }
    @Override
    public void onFailure(Call<Review[]> call, Throwable t) {
        Log.e(TAG, t.toString());
    }
});

我有修改审查审查[]因为在您的响应中没有关键的“审查”,其中包含数组的审查。

 类似资料:
  • 我使用Reformation2和RxJava2从服务器获取数据。我有以下格式的回复: 我得到以下异常: ApiService.class RetrofitClient.class 现在我正在使用如下的一些东西来获取数据: 有人请让我知道为什么我得到这个exception.Any帮助将不胜感激。 谢谢

  • 问题内容: 我需要获取JsonArray的键名,所以JSON看起来像这样,请不要,因为JSON是从数组括号开始的,并且其中包含对象,这是我想做的,因为后端将具有添加对象的能力。 因此,我需要从中获得“技术”和“科学”的名称,因为json可以动态更改,我该如何实现呢? 问题答案: 该包含秒。检索每个并用于访问每个中定义的密钥

  • 问题内容: 我正在解决有关作为服务器响应的JSONObject的问题。 正如您在响应中看到的那样,我正在解析JSONObject并创建syncresponse,synckey作为 JSON对象 createdtrs,modtrs,deletedtrs作为 JSONArray 。我想从Deletedtrs访问JSONObject,以便可以将它们分开并使用这些值。即我想提取公司编号,用户名,日期等。

  • 这是我打印日志时的JSON结果。我无法从这个结果中获得数据。请建议如何从这个结果中获得数据。错误显示of类型org.json.jsonArray不能转换为JSONObject,我知道已经有很多文章与此相关,但我不明白如何获取数据。

  • 问题内容: 我是JSON的新手,请尝试使用本教程:http : //p-xr.com/android-tutorial- how-to-parse-read-json-data-into-a-android- listview/#comments 我是JSON,C语言,Java和Android的新手,但我正在学习。本教程使用的是我所说的命名数组,但是我将在我的android项目中使用的所有JSON

  • 问题内容: 我正在使用Retrofit1旧样式 现在,我不想获取“ User”类,但是我想要获取String响应。 以前我们使用的是“ Response”,但是在改造2中没有“ Response”, 我如何在不使用任何json解析的情况下从服务器获取字符串响应或全身响应? 问题答案: 建立这个课程 与它一起使用 编辑: 您必须将其定义为 retrofit2不支持回调,因此您必须删除它。要使其异步,