2015-04-07 11 views
5

Ich benutze Realm mit Gson. Ich habe ein Modal, das eine Liste von Int-Typ-Feld hat. Der Realm unterstützt derzeit keine Liste von Primitiven. Um das zu lösen gibt es eine Lösung. Ich habe meine Klasse RealmInt erstellt.Gson Deserialisierung für Realm Liste von Primitiven

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; 
    } 
} 

Ich habe ein großes modalen Objekt so ähnlich ..

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; 

ich die json Array unten an Produkt modals deserialisieren müssen.

[{ 
     "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 
    },....] 

Es gibt eine Lösung here aber es ist nicht für große Objekte. Ich muss nur Kategorien Array ändern und andere Deserialisierung muss standardmäßig Gson Deserialisierung erfolgen.

+0

Haben Sie die Lösung gefunden? – Hunt

Antwort

7

Sie müssen einen benutzerdefinierten Adapter für jede Variable angeben, die sich von der JSON-Darstellung unterscheidet. Alle anderen Objekte werden automatisch behandelt. In Ihrem Fall ist es nur die Variable categories, da der Rest der Variablen automatisch zugeordnet werden sollte.

JSON:

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

Modellklassen:

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 Konfiguration:

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()); 

Wenn Sie hav e mehrere Wrapper-Variablen wie RealmInt müssen Sie für jedes ein TypeAdapter definieren. Beachten Sie auch, dass der obige TypeAdapter immer auf ein Array trifft. Wenn Sie JSON null anstelle von [] senden möchten, müssen Sie dies im TypeAdapter überprüfen.

+0

Danke. Gute Antwort. Das ist Arbeit –

+0

@christian Ich benutze Retrofit für Daten vom Server zu bekommen. Mein Objekt enthält einige Felder einschließlich RealmList eines anderen benutzerdefinierten Objekts. Also, wie benutzt man solche Daten in die RealmList? –

Verwandte Themen