2015-04-07 14 views
5

Ben gson ile realm kullanıyorum. Int tipi alan listesi olan bir modelim var. Bölge şu anda ilkelleri desteklemiyor. Bunu çözmek için bir çözüm var. RealmInt sınıfımı yarattım. Realm Realm listesi için Gson serileştirme

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

Böyle büyük bir modal nesne şey var ..

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; 

ben Ürün kipliklerin için aşağıdaki json dizi serisini gerekir.

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

bir çözüm here vardır ama büyük nesneler için değil. Yalnızca kategori dizisini değiştirmem gerekiyor ve diğer serileştirme varsayılan gson serileştirmesi tarafından yapılmalıdır.

+0

Çözümü buldunuz mu? – Hunt

cevap

7

JSON temsilinden farklı her değişken için bir özel tip bağdaştırıcısı belirtmeniz gerekir. Diğer tüm nesneler otomatik olarak ele alınır. Durumunuzda, değişkenlerin geri kalanı otomatik olarak eşleneceği için yalnızca categories değişkenidir.

JSON:

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

Modeli sınıfları:

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 yapılandırma:

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

Eğer hav olursa RealmInt gibi çoklu sarmalayıcı değişkenleri her biri için bir TypeAdapter tanımlamanız gerekir. Ayrıca, yukarıda TypeAdapter'in bir dizi ile karşılaşacağını unutmayın. JSON, [] yerine null gönderirseniz, TypeAdapter içinde bunun için ek denetime ihtiyacınız olacaktır.

+0

Teşekkürler. Mükemmel cevap. Thats –

+0

@christian çalışıyorum Sunucudan veri almak için retrofit kullanıyorum. Nesnem başka bir özel nesnenin RealmList'i dahil olmak üzere bazı alanları içerir. Yani, burada, nasıl bir veriyi gerçeğe dönüştürmek için kullanılır? –