Retrofit将JSONArray与GSON一起作为默认解析器

时间:2016-11-12 10:05:00

标签: android retrofit retrofit2

这个结果是由web服务发送的,我尝试用简单的类解析它,就像结果结构一样,

{
    "result":
    [
        {
            "id": "386434",
            "weight": "72.000",
            "type": "xxxxx",
            "shamsi_date": "1395/8/5",
            "date": "2016-10-26 10:52:47"
        },
        {
            "id": "395118",
            "weight": "70.000",
            "type": "xxxx",
            "shamsi_date": "1395/8/19",
            "date": "2016-11-09 10:58:29"
        }
    ],
    "message": ""
}

你可以看到result是JsonArray,我希望得到它并放到JSONARRAY,然后我尝试从中获取JSONObject

更新代码:

private void getUserAllVisits(String userId) {
    UserAllVisits userAllVisits = new UserAllVisits();
    userAllVisits.setUserId(userId);

    Call<UserAllVisits> call = myService.getUserAllVisitsCall(userAllVisits);
    call.enqueue(new Callback<UserAllVisits>() {
        @Override
        public void onResponse(Call<UserAllVisits> call, final Response<UserAllVisits> response) {
            if (response.isSuccessful()) {
                JSONArray jsonArray = new JSONArray(Arrays.asList(response.body().getResult()));
            }
        }

        @Override
        public void onFailure(Call<UserAllVisits> call, Throwable t) {
            Log.e("Err: ", t.getMessage());
        }
    });
}

在我的代码response.body().getResult().length;中返回2,我可以使用result获取response.body().getResult();数组,但我无法将简单变量定义为JSONArray并指定变为:

JSONArray jsonArray = new JSONArray(response.body().getResult());

3 个答案:

答案 0 :(得分:2)

使用ResponseBody而不是Pojo类。试试这个:

Call<ResponseBody> call =    behandamService.getUserAllVisitsCall(userAllVisits);
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, final Response<ResponseBody> response) {
        if (response.isSuccessful()) {

            //handle Exceptions here
            String jsonString = response.body().string();
            JSONObject jsonObject = new JSONObject(jsonString);
            JSONArray jsonarray = jsonObject.getJSONArray("result");
        }
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        Log.e("Err: ", t.getMessage());
    }
});

,你的界面应该是这样的

@POST // or GET method as per your requirement
Call<ResponseBody> getUserAllVisitsCall(@Body UserAllVisits userAllVisits);

答案 1 :(得分:0)

如果您只想要Retrofit返回的原始字符串,那么您不必使用RetrofitRetrofit背后的点是使用GSON转换器解析JSON。如果你不希望你可以使用简单的HttpUrlConnection

这就是你问题的答案。您可以使用onResponseresponse.body().string()获取原始字符串。

方法1

JSONObject jsonData = new JSONObject(response.raw().body().string());
JSONArray resultArray = jsonData.getJSONArray("result");

方法2

如果您的GSON库已经在项目中,

JSONArray resultArray = (JSONArray) new Gson().toJson(response.body().getResult());

答案 2 :(得分:0)

你可以使用Pojo类来创建响应的响应吗? `onResponse(){  UserAllVisits userAllVisits = response.body(); ResultClass result = userAllVisits.getResult();

}`