2015-04-07 8 views
5

Sto usando il regno con gson. Ho un modal che ha una lista di campi di tipo int. Il reame non supporta attualmente la lista dei primitivi. Per risolvere questo c'è una soluzione. Ho creato la mia classe RealmInt.Deserializzazione di Gson per l'elenco di rituali di primitive

import io.realm.RealmObject; 

public class RealmInt extends RealmObject { 
    private int val; 

    public int getVal() { 
     return val; 
    } 

    public void setVal(int val) { 
     this.val = val; 
    } 
} 

Ho un grosso oggetto qualcosa modale genere ..

public class Product extends RealmObject { 
    @PrimaryKey 
    private int productID; 
    private int priority; 
    private boolean isFavourite; 
    ..... 
    ..... 
    ..... 
    private RealmList<Document> documents; 
    private RealmList<ProductInfoGroup> productInfoGroups; 
    private RealmList<RealmInt> categories; 

devo deserializzare l'array JSON qui sotto per modali del prodotto.

[{ 
     "productID": 776, 
     "categories": [ 
      35 
     ], 
     "name": "", 
     "priority": 3, 
     ...... 
     "status": 2, 
     "documents": [ 
      { 
       "documentID": 74, 
       "productID": 776, 
       "name": null, 
       .... 
       "isDefault": true 
      } 
     ], 
     "productInfoGroups": [ 
      { 
       "productInfoGroupID": 1575, 
       "productID": 776, 
       ..... 
       "productInfos": [ 
        { 
         "productInfoID": 2707, 
         "productInfoGroupID": 1575, 
         "title": "", 
         ... 
        }, 
        { 
         "productInfoID": 2708, 
         "productInfoGroupID": 1575, 
         ... 
        }, 
        { 
         "productInfoID": 2709, 
         ..... 
        } 
       ] 
      } 
     ], 
     "lastUpdateDate": 130644319676570000, 
     "isActive": true 
    },....] 

c'è una soluzione here ma non lo è per i grandi oggetti. Devo cambiare solo l'array di categorie e l'altra deserializzazione deve essere eseguita per deserializzazione predefinita di GSON.

+0

Hai trovato la soluzione? – Hunt

risposta

7

È necessario specificare un adattatore di tipo personalizzato per ciascuna variabile che differisce dalla rappresentazione JSON. Tutti gli altri oggetti sono gestiti automaticamente. Nel tuo caso è solo la variabile categories poiché il resto delle variabili dovrebbe mappare automaticamente.

JSON:

[ 
    { "name" : "Foo", 
     "ints" : [1, 2, 3] 
    }, 
    { "name" : "Bar", 
     "ints" : [] 
    } 
] 

classi modello: configurazione

public class RealmInt extends RealmObject { 
    private int val; 

    public RealmInt() { 
    } 

    public RealmInt(int val) { 
     this.val = val; 
    } 

    public int getVal() { 
     return val; 
    } 

    public void setVal(int val) { 
     this.val = val; 
    } 
} 

public class Product extends RealmObject { 

    private String name; 
    private RealmList<RealmInt> ints; 

    // Getters and setters 
} 

GSON:

Gson gson = new GsonBuilder() 
     .setExclusionStrategies(new ExclusionStrategy() { 
      @Override 
      public boolean shouldSkipField(FieldAttributes f) { 
       return f.getDeclaringClass().equals(RealmObject.class); 
      } 

      @Override 
      public boolean shouldSkipClass(Class<?> clazz) { 
       return false; 
      } 
     }) 
     .registerTypeAdapter(new TypeToken<RealmList<RealmInt>>() {}.getType(), new TypeAdapter<RealmList<RealmInt>>() { 

      @Override 
      public void write(JsonWriter out, RealmList<RealmInt> value) throws IOException { 
       // Ignore 
      } 

      @Override 
      public RealmList<RealmInt> read(JsonReader in) throws IOException { 
       RealmList<RealmInt> list = new RealmList<RealmInt>(); 
       in.beginArray(); 
       while (in.hasNext()) { 
        list.add(new RealmInt(in.nextInt())); 
       } 
       in.endArray(); 
       return list; 
      } 
     }) 
     .create(); 

JsonElement json = new JsonParser().parse(new InputStreamReader(stream)); 
List<Product> cities = gson.fromJson(json, new TypeToken<List<Product>>(){}.getType()); 

Se si hav e più variabili wrapper come RealmInt è necessario definire un TypeAdapter per ciascuna. Si noti inoltre che TypeAdapter sopra prevede di incontrare sempre un array. se JSON è in grado di inviare null anziché [], è necessario un controllo aggiuntivo per tale opzione in TypeAdapter.

+0

Grazie. Bella risposta. Questo è il lavoro –

+0

@christian Sto usando il retrofit per ottenere dati dal server. Il mio oggetto contiene alcuni campi tra cui RealmList di un altro oggetto personalizzato. Quindi, qui, come utilizzare per avere dati del genere in realmList? –

Problemi correlati