2015-04-07 12 views
5

मैं जीएसएन के साथ दायरे का उपयोग कर रहा हूँ। मेरे पास एक मॉडल है जिसमें int टाइप फ़ील्ड की एक सूची है। दायरे वर्तमान में primitives की सूची का समर्थन नहीं करता है। इसे हल करने के लिए एक समाधान है। मैंने अपनी RealmInt कक्षा बनाई।प्राइमेटिव्स की रीयलम सूची के लिए जीसन deserialization

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

मैं उस तरह एक बड़ा मोडल वस्तु कुछ है ..

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; 

मैं उत्पाद क्रियार्थ द्योतक लिए नीचे दिए गए json सरणी deserialize चाहिए।

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

एक समाधान here है लेकिन यह बड़ी वस्तुओं के लिए नहीं है। मुझे केवल श्रेणियों के सरणी को बदलने की जरूरत है और अन्य deserialization डिफ़ॉल्ट जीएसएस deserialization द्वारा किया जाना चाहिए।

+0

क्या आपको समाधान मिला? – Hunt

उत्तर

7

आपको जेएसओएन प्रतिनिधित्व से अलग प्रत्येक चर के लिए एक कस्टम प्रकार एडाप्टर निर्दिष्ट करना होगा। अन्य सभी वस्तुओं को स्वचालित रूप से संभाला जाता है। आपके मामले में यह केवल categories चर है क्योंकि शेष चर स्वचालित रूप से मानचित्रण करना चाहिए।

JSON:

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

मॉडल कक्षाएं:

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

यदि आप हवलदार ई एकाधिक रैपर चर जैसे RealmInt आपको प्रत्येक के लिए टाइपएडाप्टर परिभाषित करने की आवश्यकता है। यह भी ध्यान रखें कि उपरोक्त टाइपएडाप्टर हमेशा एक सरणी का सामना करने की अपेक्षा करता है। यदि आप JSON [] के बजाय null भेज सकते हैं तो आपको TypeAdapter में इसके लिए अतिरिक्त जांच की आवश्यकता होगी।

+0

धन्यवाद। बहुत बढ़िया जवाब। Thats काम –

+0

@ क्रिस्टियन मैं सर्वर से डेटा प्राप्त करने के लिए retrofit का उपयोग कर रहा हूँ। मेरी वस्तु किसी अन्य कस्टम ऑब्जेक्ट के रीयलमलिस्ट सहित कुछ फ़ील्ड का सामना करती है। तो, यहां, इस तरह के डेटा को realmList में उपयोग करने के लिए कैसे उपयोग करें? –

संबंधित मुद्दे