3

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

String matchString = gson.toJson(userMatches);

日志猫:

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。

有人有什么想法吗?

4

2 回答 2

7

根据我的观察,如果你发现multiple JSON fields for ANY_VARIABLE_NAME,那么很可能是因为 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;
    }
}

下面是您需要保存/检索其对象的类。添加@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);
于 2013-10-11T16:41:02.280 回答
3

看来你的问题已经解决了,但这适用于那些没有得到答案的人(比如我):

您可能遇到的问题是该字段已存在于您扩展的类中。在这种情况下,该字段已经存在于 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”Class A,您仍将拥有该字段(因为它扩展了该类)。

于 2014-08-20T10:42:38.827 回答