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

Tomasz Dzieniak:

我创建了一个简单的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

  1. 我对么?
  2. 使此代码正常工作的最简单方法是什么?

REST服务无法修改,因此响应必须保持原样。

另外,可以通过以下方式使用纯GSON对上述json进行反序列化:

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

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

提前致谢。

Tomasz Dzieniak:

有趣的事实是...我的代码完全正确。至少是以上问题中提出的一个。

我最终从Size模型中删除了一行

当我专注于代码本身(尤其是Retrofit的配置)时,我完全忽略了导入。

原来-在实现Size模型时,我开始String为模型的字段输入类:

  • name
  • createdAt
  • updatedAt

IntelliJ IDEA的代码完成提示我

  • java.lang.String
  • com.sun.org.apache.xpath.internal.operations.String

彻底搞乱了Gson反序列化

当谈到奖励...

我决定将自己的答案标记为有效。为什么?

  • 为了确保这一点,与我完全一样遇到麻烦的所有开发人员,请确保您具有有效的导入

非常感谢上面的绅士们的出色服务。

由于我只有一个赏金,所以我决定奖励xiaoyaoworm,因为他的代码可以更好地满足我的需求(我没有在问题中编写它,但是编写这样简单的服务(如我在问题中介绍的)的想法是隐藏从最终用户的实施细节,而不是JsonArrayBNK响应中使用)。

更新1:

xiaoyaoworm答案的唯一问题是,他建议该Size模型不需要任何注释,这对于引用的JSON示例是完全错误的。

对于上述情况,模型的确切两个字段需要注释 - Sizecreated_atupdated_at

我什至已经测试了该converter-gson库的几个版本(我看到xiaoyaoworm除了我以外还使用过)-它没有改变任何东西。注释是必要的。

否则-再次感谢!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Retrofit和Gson解析嵌套列表?

如何使用Retrofit和GSON解析JSON数组?

使用Gson解析列表对象json

如何使用GSON解析并放入对象列表?

使用 GSON 和 Retrofit 解析嵌套的多态对象

使用Retrofit和Gson解析JSON数组响应

如何使用 Retrofit 2 和 GSON 解析此动态 JSON 值?

使用Retrofit和GSON解析JSON,尝试解析和获取回调时出错。

使用gson java解析和获取嵌套的json对象

使用gson java解析和获取嵌套的json对象

使用Gson解析无名称的Json数组和对象

使用Retrofit和Gson映射动态对象

使用Retrofit解析JSON数组和对象数组

如何使用GSON WHen对象解析JSON是JSONObject还是JSONArray

如何使用GSON解析多个嵌套的JSON对象/数组?

如何使用gson / retrofit获取对象数组?

如何使用 Retrofit/Moshi 解析嵌套的 JSON 对象

如何使用GSON解析json

如何使用Gson解析列表列表

Android-Retrofit Gson-如何在JSON响应中解析JSON字符串以指向JSON密钥的对象?

使用GSON解析JSON,对象有时包含列表,有时包含对象

使用gson解析名称未知的json对象

如何使用Retrofit / Gson在JSON中反序列化相同类型但具有不同字段名称的对象列表?

使用GSON和Java正确解析json

GSON解析与Retrofit解析Flickr JSON响应

如何使用Retrofit2和GSON从响应中获取特定的JSON数组?

如何使用GSON和Retrofit2反序列化多形状JSON响应?

如何使用 Codable 解析不同对象列表的 Json 数组?

使用 Retrofit 和 Gson 解析具有未知键的 JSON 字符串时遇到问题