Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gson.toString()给出错误;IllegalArgumentException:多个名为mPaint的JSON字段;_Java_Android_Exception_Gson - Fatal编程技术网

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

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

我想将自定义对象转换为字符串并保存在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声明了多个名为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

}