2013-10-11 1 views
2

Я хочу преобразовать пользовательский объект в строку и сохранить в SharePreferences, что является моей конечной целью. Я пробовал строку ниже, которая терпит неудачу.Gson.toString() дает ошибку «IllegalArgumentException: несколько полей JSON с именем mPaint»

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 Нет. Он преобразуется в строку напрямую. – 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

Кажется, ваша проблема уже решена, но это для людей, которые Ждут» t довольно получить их ответ (как я):

Проблема, которую вы можете иметь, состоит в том, что поле al готовый существует в классе, который вы расширяете. В этом случае поле будет существовать в классе 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, а в другом подклассе - объект. Любое предложение ! – CoDe

+0

Если честно, это звучит как плохой дизайн/именование. –

+0

Да, может быть ... но есть ли способ рассмотреть это! – CoDe

Смежные вопросы