2013-10-11 40 views
2

我想將自定義對象轉換爲字符串並保存在SharePreferences中,這是我的最終目標。我在線以下嘗試失敗。Gson.toString()給出錯誤「IllegalArgumentException:多個名爲mPaint的JSON字段」

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。

任何人有任何想法?

+0

你可以分享你的代碼來生成JsonObject嗎?正如在日誌中它表明mPain被多次聲明? –

+0

如果我沒有錯,gson.toJson會將它轉換爲json對象,然後可以將它轉換爲jsonobj的字符串 –

+0

@DharaShah號,它會直接轉換爲String。 – Geek

回答

6

根據我的觀察,如果您發現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; 
    } 
} 

以下是您需要保存/檢索對象的類。 爲需要保存和/或檢索的變量添加@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); 
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」A類,並且您仍將擁有該字段(因爲它擴展了該類)。

+0

但是,如果在兩個類中使用相同的密鑰用於不同類型的對象響應呢?在我的情況下,在一種情況下,它響應ArrayList,在其他子類中它是一個Object。任何建議! – CoDe

+0

說實話,這聽起來像不好的設計/命名。 –

+0

是的,這可能是..但有什麼辦法可以考慮這個! – CoDe