2011-07-28 20 views
21

que tiene este esquema:GSON - serializador personalizado en el caso específico

public class Student { 
     public String name; 
     public School school; 
} 

public class School { 
     public int id; 
     public String name; 
} 
public class Data { 
     public ArrayList<Student> students; 
     public ArrayList<School> schools; 
} 

me gustaría serializar el objeto de datos con Gson, y obtener algo como:

{ "students": [{ 
       "name":"name1", 
       "school": "1"   //the id of the scool, not its entire Json 
       }], 
    "school": [{      //the entire JSON 
       "id" : "1", 
       "name": "schoolName" 
      }] 
} 

Para hacer eso, debe usar un serializador personalizado para la parte del alumno, de modo que Gson solo imprima el ID de la Escuela. Pero para la escuela, tengo que tener el serializador nominal.

¿Cómo puedo hacer todo con un solo objeto Gson?

Respuesta

34

puede escribir un serializador personalizado algo como esto:

public class StudentAdapter implements JsonSerializer<Student> { 

@Override 
public JsonElement serialize(Student src, Type typeOfSrc, 
      JsonSerializationContext context) { 

     JsonObject obj = new JsonObject(); 
     obj.addProperty("name", src.name); 
     obj.addProperty("school", src.school.id); 

     return obj; 
    } 
} 
+0

bien, Me gustaría hacer esto, incluso si es aburrido cuando hay muchos campos, y solo una clave externa ... –

17

Por supuesto donde quiera que van a serializar este objeto es necesario agregar a la Gson así:

GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(Student.class, new StudentAdapter()); 
return gsonBuilder.create().toJson([YOUR_OBJECT_TO_BE_SERIALIZED]);