为啥 Retrofit & Gson 返回 LinkedTreeMap 列表而不是我预期的类型?

Posted

技术标签:

【中文标题】为啥 Retrofit & Gson 返回 LinkedTreeMap 列表而不是我预期的类型?【英文标题】:Why does Retrofit & Gson return a List of LinkedTreeMap instead of my expected type?为什么 Retrofit & Gson 返回 LinkedTreeMap 列表而不是我预期的类型? 【发布时间】:2018-04-10 10:33:36 【问题描述】:

我正在尝试通过 Retrofit 检索对象列表:

public interface TemplateApi 
    @GET("/api/templates")
    Observable<List<TemplateDto>> getList();

这里是 Dto:

public class TemplateDto 
    public String id;
    public String name;

    @Override
    public String toString() 
        return this.name;
    

我得到的不是预期的列表

List<LinkedTreeMap>

这会导致奇怪的副作用(在我的情况下 toString() 返回的结果不是我所期望的)

【问题讨论】:

【参考方案1】:

好的,我发现了 - android 确实没有最平坦的学习曲线...

问题不在于 Retrofit 或 Gson 本身,而在于缩小器(Proguard)。 Proguard 需要在一个名为“proguard-rules.pro”的文件中默认配置。

添加以下行:

-keepattributes Signature
-keepattributes *Annotation*
-keep class com.myproject.dtos.**  *; 

感谢this answer。

【讨论】:

以上是关于为啥 Retrofit & Gson 返回 LinkedTreeMap 列表而不是我预期的类型?的主要内容,如果未能解决你的问题,请参考以下文章

Retrofit + GSON处理JSON模板

Retrofit Gson解析空字符串的问题

Retrofit com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept

如何使用Retrofit 2和Gson来模拟JSON响应“密钥”频繁更改的数据

如何使用Retrofit2,RxJava2,Gson TypeAdapterFActory正确映射Gson?

Retrofit请求数据对错误以及网络异常的处理