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

Gee*_*eek 3 java android exception gson

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

String matchString = gson.toJson(userMatches);
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

任何人有任何想法?

Gee*_*eek 7

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

添加以下类以告诉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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class myClass {
    @SerializedName("id")
    int id;
    @SerializedName("name")
    String name;
}
Run Code Online (Sandbox Code Playgroud)

将myObject转换为jsonString的代码:

Exclude ex = new Exclude();
    Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();
String jsonString = gson.toJson(myObject);
Run Code Online (Sandbox Code Playgroud)

从jsonString获取对象的代码:

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