Gson 缺少对象 ArrayList 的类型参数

Posted

技术标签:

【中文标题】Gson 缺少对象 ArrayList 的类型参数【英文标题】:Gson missing type parameter for ArrayList of objects 【发布时间】:2016-11-06 03:44:24 【问题描述】:

我有这个 JSON 对象,其中包含“联系人”对象列表及其子对象。我正在尝试使用 gson 在我的 JSON 对象中获取 Model 对象的 ArrayList ,但它返回缺少类型参数异常。 我得到这样的类型:

Type listType = new TypeToken<ArrayList<tModel>>() .getType();

并试图得到这样的列表:

GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();

ArrayList<Model> = gson.fromJson(jsonString, listType);

在我的 proguard 中,我保留了这样的对象包:

-keep class .somerepo.contactModel.**  *; 

我见过类似的问题,但没有一个能解决我的问题。

这是堆栈跟踪:

致命异常:AsyncTask #2 进程:...,PID: 10360 java.lang.RuntimeException:执行时发生错误 做背景() 在 android.os.AsyncTask$3.done(AsyncTask.java:300) 在 java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 在 java.util.concurrent.FutureTask.setException(FutureTask.java:222) 在 java.util.concurrent.FutureTask.run(FutureTask.java:242) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 在 java.lang.Thread.run(Thread.java:841) 原因:java.lang.RuntimeException:缺少类型参数。 在 com.google.gson.reflect.TypeToken.getSuperclassTypeParameter(SourceFile:84) 在 com.google.gson.reflect.TypeToken.(SourceFile:62) 在 semereop.contact.Contact$1.(SourceFile:184) 在 somerepo.contact.Contact.geModelFromJson(SourceFile:184)

geModelFromJson 方法从 gson 返回 ArrayList&lt;Model&gt;

【问题讨论】:

请分享完整的堆栈跟踪 @sidgate 我更新了帖子:) 你能发布你的模型和你试图转换的字符串吗? 【参考方案1】:

您必须在您的 proguard 文件中添加更多信息:

# Gson uses generic type information stored in a class file when working with fields. 
# Proguard removes such information by default, so configure it to keep all of it.
-keepattributes Signature
-keepattributes EnclosingMethod
-keepattributes InnerClasses
-keepattributes Annotation

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-keep class sun.misc.Unsafe  *; 

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.**  *; 

有关更多详细信息,请查看 GSON 存储库中提供的 Proguard 文件的 this example。

【讨论】:

只是添加到这个答案:使用默认 proguard 配置时只需要 -keepattributes 签名。 只需要 -keepattributes 签名并为我工作

以上是关于Gson 缺少对象 ArrayList 的类型参数的主要内容,如果未能解决你的问题,请参考以下文章

实例:Gson解析泛型对象

Android:Gson通过借助TypeToken获取泛型参数的类型的方法

Konlin中的Gson toJson和ArrayList

Gson通过借助TypeToken类来解决这个问题

Gson解析date类型 范例

Kotlin:Reified类型参数使Gson失败