改造:用杰克逊反序列化失败,没有任何错误

Posted

技术标签:

【中文标题】改造:用杰克逊反序列化失败,没有任何错误【英文标题】:Retrofit: deserialization with jackson fails without any error 【发布时间】:2018-04-14 04:15:28 【问题描述】:

我有以下用于调用 Rest-API 的代码:服务

Retrofit client = Client.getClient();
Call<ResponseBeanOutput<UserBeanOutput>> call = client.create(AuthResource.class).login("username","password","true");
Response<ResponseBeanOutput<UserBeanOutput>> response = call.execute();

通过静态方法获取客户端:

public static Retrofit getClient() 
    ObjectMapper mapper = new ObjectMapper();
    return new Retrofit.Builder()
            .baseUrl(getBaseUrl())
            .addConverterFactory(JacksonConverterFactory.create(mapper))
            .build();

服务器以 JSON 格式发送响应,如下所示:


    "error": false,
    "message": "Successfull login",
    "errorCode": 0,
    "data": 
        "uid": 7,
        "email": "user@example.com",
        "name": "username",
        "nick": "usernick",
        "photoUrl": "media/profiles/defaultImageProfile.png",
        "lts": "aaaaeqc9lf9od82rk633aaaaa"
    

我必须将此响应映射到包含 UserBeanOutput 类型的字段(数据)的通用对象 ResponseBeanOutput(映射 json 对象中的对象“数据”)。所以最后 ResponseBeanOutput 将映射字段“error”、“message”、“errorCode”,数据将是“UserBeanOutput”类型的对象,包含“uid”、“email”、“nick”等。

我的问题是所有对象都是空的(null),我没有错误。

我还尝试从 ResponseBeanOutput 中删除泛型类型,并使用带有“错误”和“消息”字段的简单 bean 映射响应,并使用 releted getter 和 setter 但没有任何成功。

我做错了什么?

【问题讨论】:

你尝试调试改造吗?在大多数情况下,它对我有用,当我不明白为什么 3-rd 方库不能按我预期的那样工作时。只需在 .execute() 方法的开头下一个断点,一步一步找到原因。 【参考方案1】:

我按照@Yevhenii Semenov 的建议解决了问题,调试了 execute() 方法。我发现问题出在没有在响应中返回正文的 API 中,因此反序列化为空。 初始化客户端的代码很好。

谢谢

【讨论】:

以上是关于改造:用杰克逊反序列化失败,没有任何错误的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试反序列化对象列表时,杰克逊抛出错误映射异常

杰克逊未能将字符串反序列化为 Joda-Time

杰克逊错误:没有适合简单类的构造函数

Spring框架中的Jackson反序列化错误处理

杰克逊在没有双引号的情况下序列化和反序列化对象

杰克逊不能反序列化空数组