我已经创建了一个简单的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返回的响应既不是对象,也不是数组。
REST服务不能修改为,因此响应必须保持原样。
此外,使用纯GSON对上面的json进行反序列化可以通过以下方式完成:
Type sizesType = new TypeToken<List<Size>>(){}.getType();
List<Size> size = new Gson().fromJson(json, sizesType);
但是我不知道如何让Retrofit 2使用它。
提前谢谢。
https://stackoverflow.com/questions/36656827
复制相似问题