Java Gson.toString()给出错误;IllegalArgumentException:多个名为mPaint的JSON字段;
我想将自定义对象转换为字符串并保存在SharePreferences中,这是我的最终目标。我试过线下,但失败了Java Gson.toString()给出错误;IllegalArgumentException:多个名为mPaint的JSON字段;,java,android,exception,gson,Java,Android,Exception,Gson,我想将自定义对象转换为字符串并保存在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
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声明了多个名为mPaint的JSON字段
。不知道什么是mPaint
有人知道吗?根据我的观察,如果您发现任何变量名都有多个JSON字段,那么很可能是因为GSON无法将object转换为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;
}
}
将myObject转换为jsonString的代码:
Exclude ex = new Exclude();
Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();
String jsonString = gson.toJson(myObject);
Exclude ex = new Exclude();
Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();
myClass myObject = gson.fromJson(jsonString, myClass.class);
从jsonString获取对象的代码:
Exclude ex = new Exclude();
Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();
String jsonString = gson.toJson(myObject);
Exclude ex = new Exclude();
Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();
myClass myObject = gson.fromJson(jsonString, myClass.class);
看起来你的问题已经解决了,但这是为那些没有得到答案的人(比如我)准备的: 您可能遇到的一个问题是,该字段已存在于您扩展的类中。在这种情况下,字段将已经存在于类B中 说: 其中B类类似(当然可能还有更多的副本):
只需将其从字段“netAmountPcy”类别A中删除,您仍将保留该字段(因为它扩展了该类别)。您可以共享生成JsonObject的代码吗?正如在日志中一样,它指示mPain被多次声明?如果我没有错,gson.toJson将把它转换为json对象,然后您可以将它从jsonobj@DharaShah不。它直接转换成字符串。@AmitGupta是的,它这样说,我在任何地方都不使用mPaint。它位于sdk类BoringLayout中。userMatches是自定义对象,不是JSONObject。@日志中的Akash不清楚。所以,你们能分享你们的一些代码吗?但若在两个类中对不同类型的对象响应使用相同的键呢。在我的例子中,一个例子是respond ArrayList,另一个子类是Object。任何建议!老实说,这听起来很糟糕的设计/命名。是的,可能是…但有什么办法来考虑这一点!如果您正在使用的类超出了您的控制范围,您如何处理这个问题?e、 g.第三方图书馆
public class B {
private BigDecimal netAmountPcy;
// getter and setter for the above fields
}