使用GSON序列化java对象
我想将此对象序列化为JSON String
public class Person { public String id; public String name; public Person parent; }
并获得这样的结果:
{id: 1, name: "Joe", parent: 2}
我试着用
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);
但不是那样,我得到了:
"1"
PersonSerializer:
public class PersonSerializer implements JsonSerializer { public JsonElement serialize(Person src, Type typeOfSrc, ...) { return new JsonPrimitive(src.id); } }
欢迎任何建议
谢谢,马里奥
为了得到你想要的结果,你需要像这样编写序列化器:
public static class PersonSerializer implements JsonSerializer { 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; } }
结果
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));
将会
{"id":1,"name":"Joe","parent":2}
完整代码:
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 { 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)); } }
你刚才得到了答案。 但是,我想通过使用@JsonAdapter注释以另一种方式与您分享。
像这样注释Person bean
@JsonAdapter(PersonAdatper.class) public class Person { public int id; public String name; public Person parent; }
创建定制适配器
public class PersonAdatper extends TypeAdapter { @Override public void write(JsonWriter writer, Person value) throws IOException { writer.beginObject(); writer.name("id").value(value.getId()); writer.name("name").value(value.getName()); Person parent = value.getParent(); if (parent != null) { writer.name("parent").value(parent.getId()); } writer.endObject(); } @Override public Person read(JsonReader in) throws IOException { // do something you need return null; } }
将对象序列化为json字符串
Person p = new Person(1, "Joe", new Person(2, "Mike")); Gson gson = new Gson(); String result = gson.toJson(p);
它产生如下输出:
{"id":1,"name":"Joe","parent":2}
我从使用JsonAdapter的GSON Annotations示例教程中找到了这种方法