使用 GSON 序列化时出现“声明多个 JSON 字段命名”错误

Posted

技术标签:

【中文标题】使用 GSON 序列化时出现“声明多个 JSON 字段命名”错误【英文标题】:Getting "declares multiple JSON fields named" error when serializing with GSON 【发布时间】:2019-03-24 23:59:27 【问题描述】:
Type type = new TypeToken<HashMap<String , MovieDb>>() .getType();
gson.fromJson(json, type); //ERROR HERE !!!

当我从 Json 转换为 hashmap 对象时,它可以正常工作而无需启用缩小。但是当启用 minify 时,它在这一行给我以下错误:

java.lang.IllegalArgumentException: class a.a.a.a.b declares multiple JSON fields named a
        at com.google.b.b.a.i.a(ReflectiveTypeAdapterFactory.java:172)
        at com.google.b.b.a.i.a(ReflectiveTypeAdapterFactory.java:102)
        at com.google.b.e.a(Gson.java:458)
        at com.google.b.b.a.b.a(CollectionTypeAdapterFactory.java:53)
        at com.google.b.e.a(Gson.java:458)
        at com.google.b.b.a.i.a(ReflectiveTypeAdapterFactory.java:117)
        at com.google.b.b.a.i.a(ReflectiveTypeAdapterFactory.java:166)
        at com.google.b.b.a.i.a(ReflectiveTypeAdapterFactory.java:102)
        at com.google.b.e.a(Gson.java:458)
        at com.google.b.b.a.g.a(MapTypeAdapterFactory.java:126)
        at com.google.b.e.a(Gson.java:458)
        at com.google.b.e.a(Gson.java:926)
        at com.google.b.e.a(Gson.java:892)
        at com.google.b.e.a(Gson.java:841)
        at com.techy.nateshmbhat.moviego.i.onPreExecute(MovieInterface.java:180)
        at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:648)
        at android.os.AsyncTask.execute(AsyncTask.java:595)
        at com.techy.nateshmbhat.moviego.i.b(MovieInterface.java:101)
        at com.techy.nateshmbhat.moviego.a.a(Activity_InTheaterMovies.java:55)

【问题讨论】:

发送您的 MovieDb.java 代码或 MovieInterface.java MovieDb 是否扩展了另一个课程? 【参考方案1】:

您的错误很可能是因为您将两个字段缩小为同一个名称a。比如:

@SerializedName("a")
Long veryLongFieldName;

@SerializedName("a")
Long anotherVeryLongFieldName;

请注意,它们可以在同一个类中,或者如果使用继承,它们在同一个继承树中就足够了。 Gson 不能将两个值分配给一个最小化的字段名称a

当然也可能是您已将某些字段最小化为已被其他未最小化字段保留的名称。

【讨论】:

以上是关于使用 GSON 序列化时出现“声明多个 JSON 字段命名”错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥在启动 Spring Boot 应用程序时出现 Gson builder 错误?

Gson 将 List<String> 反序列化为 realmList<RealmString>

让我们畅通无阻:在 Scala 中使用 GSON 读取 Json

使用 GSON 序列化到 JSON 的类是不是应该实现可序列化接口

Newtonsoft.Json.JsonSerializationException:'反序列化对象时出现意外标记:使用动态对象注释

使用DataContractJsonSerializer发序列化对象时出现的异常