【发布时间】:2016-08-07 23:57:06
【问题描述】:
我创建了一个简单的 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 列路径 $[0].name 处为 STRING
我想这个错误是由这个引起的,REST API 返回的响应既不是数组也不是对象。
- 我说的对吗?
- 让这段代码工作的最简单方法是什么?
REST 服务无法修改,因此响应必须保持原样。
此外,使用纯 GSON 对上述 json 进行反序列化可以通过以下方式完成:
Type sizesType = new TypeToken<List<Size>>(){}.getType();
List<Size> size = new Gson().fromJson(json, sizesType);
但我不知道如何让 Retrofit 2 使用它。
提前致谢。
【问题讨论】:
-
你试过没有
lombok注解吗?也许他们以某种方式让 GSON 认为 name 是一个对象,而不是一个字符串? -
是的,我试过了。没有变化,同样的错误。
标签: java json rest gson retrofit2