我创建了一个简单的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 = 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
我想该错误是由此引起的,REST API返回的响应既不是数组也不是object。
REST服务无法修改,因此响应必须保持原样。
另外,可以通过以下方式使用纯GSON对上述json进行反序列化:
Type sizesType = new TypeToken<List<Size>>(){}.getType();
List<Size> size = new Gson().fromJson(json, sizesType);
但是我不知道如何使Retrofit 2能够使用它。
提前致谢。
有趣的事实是...我的代码完全正确。至少是以上问题中提出的一个。
我最终从Size
模型中删除了一行。
当我专注于代码本身(尤其是Retrofit的配置)时,我完全忽略了导入。
原来-在实现Size
模型时,我开始String
为模型的字段输入类:
name
createdAt
updatedAt
IntelliJ IDEA的代码完成提示我
java.lang.String
com.sun.org.apache.xpath.internal.operations.String
彻底搞乱了Gson
反序列化。
当谈到奖励...
我决定将自己的答案标记为有效。为什么?
非常感谢上面的绅士们的出色服务。
由于我只有一个赏金,所以我决定奖励xiaoyaoworm,因为他的代码可以更好地满足我的需求(我没有在问题中编写它,但是编写这样简单的服务(如我在问题中介绍的)的想法是隐藏从最终用户的实施细节,而不是JsonArray
在BNK响应中使用等)。
xiaoyaoworm答案的唯一问题是,他建议该Size
模型不需要任何注释,这对于引用的JSON示例是完全错误的。
对于上述情况,模型的确切两个字段都需要注释 - 和。Size
created_at
updated_at
我什至已经测试了该converter-gson
库的几个版本(我看到xiaoyaoworm除了我以外还使用过)-它没有改变任何东西。注释是必要的。
否则-再次感谢!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句