2012-06-14 21 views
25

me gustaría serializar este objeto a JSON cadenaSerialize objeto Java con GSON

public class Person { 
    public String id; 
    public String name; 
    public Person parent; 
} 

y obtener un resultado como este:

{id: 1, name: "Joe", parent: 2} 

He intentado utilizar

Person p = new Person(1, "Joe", new Person(2, "Mike")); 
Gson gson = new GsonBuilder() 
      .registerTypeAdapter(Persona.class, new PersonSerializer()).create(); 
String str = gson.toJson(p); 

pero en lugar de eso, obtuve:

"1" 

PersonSerializer:

public class PersonSerializer implements JsonSerializer<Person> { 
    public JsonElement serialize(Person src, Type typeOfSrc, ...) { 
     return new JsonPrimitive(src.id); 
    } 
} 

Por favor, cualquier sugerencia es bienvenida

Gracias, Mario

+0

http://stackoverflow.com/q/7085545/1815624 y http://stackoverflow.com/q/10067441/1815624 estaban relacionados en mi caso, pero fue http://stackoverflow.com/questions/10067441/gson-converts-to-linkedhashmap-instead-of-my-object#comment62206167_33561747 que lo solucionó – CrandellWS

Respuesta

55

Con el fin de obtener el resultado que desea, usted necesita escribir el serializador como esto:

public static class PersonSerializer implements JsonSerializer<Person> { 
    public JsonElement serialize(final Person person, final Type type, final JsonSerializationContext context) { 
     JsonObject result = new JsonObject(); 
     result.add("id", new JsonPrimitive(person.getId())); 
     result.add("name", new JsonPrimitive(person.getName())); 
     Person parent = person.getParent(); 
     if (parent != null) { 
      result.add("parent", new JsonPrimitive(parent.getId())); 
     } 
     return result; 
    } 
} 

El resultado para

Person p = new Person(1, "Joe", new Person(2, "Mike")); 
    com.google.gson.Gson gson = new GsonBuilder().registerTypeAdapter(Person.class, new PersonSerializer()) 
      .create(); 
    System.out.println(gson.toJson(p)); 

habrá

{"id":1,"name":"Joe","parent":2} 

Código completo:

import java.lang.reflect.Type; 

import com.google.gson.GsonBuilder; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonObject; 
import com.google.gson.JsonPrimitive; 
import com.google.gson.JsonSerializationContext; 
import com.google.gson.JsonSerializer; 

public class GsonSimpleTest { 

    public static class Person { 
     public int id; 
     public String name; 
     public Person parent; 

     public Person(final int id, final String name) { 
      super(); 
      this.id = id; 
      this.name = name; 
     } 

     public Person(final int id, final String name, final Person parent) { 
      super(); 
      this.id = id; 
      this.name = name; 
      this.parent = parent; 
     } 

     public int getId() { 
      return id; 
     } 

     public void setId(final int id) { 
      this.id = id; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(final String name) { 
      this.name = name; 
     } 

     public Person getParent() { 
      return parent; 
     } 

     public void setParent(final Person parent) { 
      this.parent = parent; 
     } 

    } 

    public static class PersonSerializer implements JsonSerializer<Person> { 
     public JsonElement serialize(final Person person, final Type type, final JsonSerializationContext context) { 
      JsonObject result = new JsonObject(); 
      result.add("id", new JsonPrimitive(person.getId())); 
      result.add("name", new JsonPrimitive(person.getName())); 
      Person parent = person.getParent(); 
      if (parent != null) { 
       result.add("parent", new JsonPrimitive(parent.getId())); 
      } 
      return result; 
     } 
    } 

    public static void main(final String[] args) { 
     Person p = new Person(1, "Joe", new Person(2, "Mike")); 
     com.google.gson.Gson gson = new GsonBuilder().registerTypeAdapter(Person.class, new PersonSerializer()) 
       .create(); 
     System.out.println(gson.toJson(p)); 
    } 

} 
+0

Gracias Spaeth, buen enfoque – Mario

6

que acaba de recibir la respuesta. Sin embargo, quiero compartirlo de otra manera mediante el uso de la anotación @JsonAdapter.

anotado el grano persona como esta

@JsonAdapter(PersonAdatper.class) 
public class Person { 
    public int id; 
    public String name; 
    public Person parent; 
} 

Crear adaptador personalizado

objeto Serialize a cadena JSON

Person p = new Person(1, "Joe", new Person(2, "Mike")); 
Gson gson = new Gson();  
String result = gson.toJson(p); 

Se produce la salida, como a continuación:

{"id":1,"name":"Joe","parent":2} 

yo encontramos este camino desde el tutorial GSON Annotations Example using JsonAdapter