Gson.toString()给出错误“IllegalArgumentException:多个名为mPaint的JSON字段”

我想将自定义对象转换为字符串并保存在SharePreferences中,这是我的最终目标。 我尝试下面的线失败了。

String matchString = gson.toJson(userMatches); 

Logcat:

 10-11 15:24:33.245: E/AndroidRuntime(21427): FATAL EXCEPTION: main 10-11 15:24:33.245: E/AndroidRuntime(21427): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=4001, result=-1, data=null} to activity {com.objectlounge.ridesharebuddy/com.objectlounge.ridesharebuddy.activities.RS_CreateTripActivity}: java.lang.IllegalArgumentException: class android.text.BoringLayout declares multiple JSON fields named mPaint 10-11 15:24:33.245: E/AndroidRuntime(21427): at android.app.ActivityThread.deliverResults(ActivityThread.java:3302) 

我尝试了很多选项,并相信自定义对象中有变量的东西。 关注错误日志的是java.lang.IllegalArgumentException: class android.text.BoringLayout declares multiple JSON fields named mPaint 。 不知道什么是mPaint。

任何人都有任何想法?

根据我的观察,如果你发现multiple JSON fields for ANY_VARIABLE_NAMEmultiple JSON fields for ANY_VARIABLE_NAME ,那很可能是因为GSON无法将对象转换为jsonString而jsonString转换为object。 你可以尝试下面的代码来解决它。

添加以下类以告诉GSON仅保存和/或检索声明了序列化名称的变量。

 class Exclude implements ExclusionStrategy { @Override public boolean shouldSkipClass(Class arg0) { // TODO Auto-generated method stub return false; } @Override public boolean shouldSkipField(FieldAttributes field) { SerializedName ns = field.getAnnotation(SerializedName.class); if(ns != null) return false; return true; } } 

下面是您需要保存/检索其对象的类。 为需要保存和/或检索的变量添加@SerializedName

 class myClass { @SerializedName("id") int id; @SerializedName("name") String name; } 

将myObject转换为jsonString的代码:

 Exclude ex = new Exclude(); Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create(); String jsonString = gson.toJson(myObject); 

从jsonString获取对象的代码:

 Exclude ex = new Exclude(); Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create(); myClass myObject = gson.fromJson(jsonString, myClass.class); 

看来你的问题已经解决了,但是对于那些没有得到答案的人(像我一样):

您可能遇到的问题是该字段已存在于您扩展的类中。 在这种情况下,该字段已存在于B类中。

说:

 public class A extends B { private BigDecimal netAmountTcy; private BigDecimal netAmountPcy; private BigDecimal priceTo; private String segment; private BigDecimal taxAmountTcy; private BigDecimal taxAmountPcy; private BigDecimal tradeFeesTcy; private BigDecimal tradeFeesPcy; // getter and setter for the above fields } 

B类是类似的东西(当然可能更多重复):

 public class B { private BigDecimal netAmountPcy; // getter and setter for the above fields } 

只需删除字段“netAmountPcy”A类,您仍然可以使用该字段(因为它扩展了类)。