Android Retrofit从Web服务获取数组

时间:2016-11-05 11:03:30

标签: android retrofit retrofit2

以下jsonArray是Web服务的结果:

{
    "property":
    {
        "id": "2",
        "title": "qqqqqqq",
        "alias": "wwwwwwwww"
    },
    "foodList":
    [
        {
            "meal": "1111",
            "food": "1111111111"
        },
        {
            "meal": "22222",
            "food": "2222222222"
        },
        {
            "meal": "3333333",
            "food": "3333333333"
        }
    ]
}

我试着去解析它,但是我收到了这个错误:

错误

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was
BEGIN_ARRAY at line 1 column 131 path $.foodList

类模型与结果一样:

public class FoodLists {
    private String userId;
    private Property property;
    private FoodList foodList;

    public class Property {
        private int id;
        private String title;
        private String alias;

        /* Setter and Getters*/
    }
    public class FoodList {
        private String meal;
        private String food;

        /* Setter and Getters*/
    }

    /* Setter and Getters*/
}

以及我的改进方法:

private void getUserFoodsLists() {
    FoodLists getFoods = new FoodLists();
    getFoods.setUserId("301323");
    Call<FoodLists> call = behandamService.getFoodListsCall(getFoods);
    call.enqueue(new Callback<FoodLists>() {
        @Override
        public void onResponse(Call<FoodLists> call, Response<FoodLists> response) {
            if (response.isSuccessful()) {
            }
        }

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

如何通过改造获得此阵列,提前致谢

2 个答案:

答案 0 :(得分:1)

  

java.lang.IllegalStateException:预期BEGIN_OBJECT但是   BEGIN_ARRAY在第1行第131栏路径$ .foodList

表示响应返回JsonArray,但您告诉Gson将其解析为JsonObject。在您的模型类中,更改

 FoodList foodList;

 List<FoodList> foodList;

答案 1 :(得分:0)

您当前拥有的FoodLists模型与您从服务器收到的JSON响应不匹配,因此您会收到错误。

这里有两个选项 - 显而易见的是更改您的POJO以匹配响应(在其他答案之一中提供了有效的POJO)。这里的缺点是POJO可能看起来很丑陋并且有一些你并不真正需要的信息。

如果你想让你的POJO保持清洁,可能会有更好的选择,例如,如果你在其他地方使用它们,例如作为数据库模型或其他东西。 在这种情况下,您可以使用自定义JsonDeserializer并手动将响应转换为所需的POJO。如果您对此方法感兴趣,HERE就是如何使用它的完整示例。