首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Retrofit和GSON解析由[]包围的JSON对象列表?

如何使用Retrofit和GSON解析由[]包围的JSON对象列表?
EN

Stack Overflow用户
提问于 2016-04-16 05:07:10
回答 3查看 27.2K关注 0票数 30

我已经创建了一个简单的REST端点:

http://<server_address>:3000/sizes

此URL返回一个非常简单的响应,其中包含一个json数组,如下所示:

[
  { "id": 1, "name": "Small", "active": true },
  { "id": 2, "name": "Medium", "active": true },
  { "id": 3, "name": "Large", "active": true }
]

现在,我正在尝试使用带有GSON的Retrofit 2来消费这个响应。

我添加了一个模型:

@lombok.AllArgsConstructor
@lombok.EqualsAndHashCode
@lombok.ToString
public class Size {
    private int id;
    private String name;
    private boolean active;

    @SerializedName("created_at")
    private String createdAt;

    @SerializedName("updated_at")
    private String updatedAt;
}

和服务:

public interface Service {
    @GET("sizes")
    Call<List<Size>> loadSizes();
}

我已经实例化了一个Retrofit:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("http://<server_address>:3000")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

我的服务是:

Service service = retrofit.create(Service.class);

现在,尝试调用数据:

service.loadSizes().enqueue(new Callback<List<Size>>() {
    @Override
    public void onResponse(Call<List<Size>> call, Response<List<Size>> response) {
        for(Size size: response.body()) {
            System.out.println(size.toString());
        }
    }

    @Override
    public void onFailure(Call<List<Size>> call, Throwable t) {
        System.out.println(t.getMessage());
    }
});

最终出现异常的是:

java.lang.IllegalStateException:应为BEGIN_OBJECT,但在第1行第18列路径$.name处为字符串

我认为错误是因为REST API返回的响应既不是对象,也不是数组。

  1. 我说得对吗?
  2. 让这段代码正常工作的最简单方法是什么?

REST服务不能修改为,因此响应必须保持原样。

此外,使用纯GSON对上面的json进行反序列化可以通过以下方式完成:

Type sizesType = new TypeToken<List<Size>>(){}.getType();
List<Size> size = new Gson().fromJson(json, sizesType);

但是我不知道如何让Retrofit 2使用它。

提前谢谢。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36656827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档