Deserialización de Gson para la lista de primitivos del reino

Estoy usando reino con gson. Tengo un modal que tiene una lista del campo del tipo del int. Realm no admite actualmente la lista de primitivas. Para resolver esto hay una solución. He creado mi clase RealmInt.

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

Tengo un gran objeto modal algo así.

 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; 

Debo deserializar el arreglo de json abajo a los modales del producto.

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

Hay una solución aquí, pero no es para objetos grandes. Necesito cambiar solamente las categorías el arsenal y la otra deserialización se deben hacer por defecto la deserialización del gson.

Debe especificar un adaptador de tipo personalizado para cada variable que difiere de la representación JSON. Todos los demás objetos se manejan automáticamente. En su caso es sólo la variable de categories como el resto de las variables deben mapear automáticamente.

JSON:

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

Clases de modelos:

 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 } 

Configuración 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()); 

Si tiene varias variables de contenedor, como RealmInt, debe definir un TypeAdapter para cada una. También tenga en cuenta que el TypeAdapter anterior espera encontrar siempre una matriz. Si JSON puede enviar null lugar de [] necesitará una comprobación adicional para que en el TypeAdapter.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.