您可以使用Gson对 JSON 表示的对象进行序列化和反序列化。Gson 内置了能够处理通用对象的序列化器和反序列化器,但是如果您需要一些特殊的东西,那么您可以实现自己的。在问题中提到的示例中,如果该类具有不带参数的构造函数,则通用序列化器和反序列化器可能会起作用。
做你需要的简单方法如下:
public class Person {
private String name;
private int age;
private Person parent = null;
public Person() {
// Required no-args constructor for Gson.
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
序列化
Person joe = new Person("Joe", 20);
Gson gson = new Gson();
String json = gson.toJson(joe);
==> json is {"name":"Joe","age":"20"}
请注意,您不能使用循环引用序列化对象,因为这将导致无限递归。此外,问题中提供的示例是不可能的,因为父母将被无限期地实例化。
反序列化
Person joe = gson.fromJson(json, Person.class);
如果您需要比这更自定义的东西,您可以使用自定义序列化和反序列化。从用户指南:
自定义序列化和反序列化
有时默认表示不是您想要的。处理库类(DateTime 等)时经常出现这种情况。Gson 允许您注册自己的自定义序列化器和反序列化器。这是通过定义两个部分来完成的: Json Serialiers:需要为对象定义自定义序列化 Json Deserializers:需要为类型定义自定义反序列化 Instance Creators:如果无参数构造函数可用或已注册反序列化器,则不需要
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(MyType2.class, new MyTypeAdapter());
gson.registerTypeAdapter(MyType.class, new MySerializer());
gson.registerTypeAdapter(MyType.class, new MyDeserializer());
gson.registerTypeAdapter(MyType.class, new MyInstanceCreator());
registerTypeAdapter 调用检查类型适配器是否实现多个这些接口并为所有这些接口注册它。
编写序列化程序
这是一个如何为 JodaTime DateTime 类编写自定义序列化程序的示例。
private class DateTimeSerializer implements JsonSerializer<DateTime> {
public JsonElement serialize(DateTime src, Type typeOfSrc,
JsonSerializationContext context) {
return new JsonPrimitive(src.toString());
}
}
Gson 在序列化过程中遇到 DateTime 对象时调用 toJson()。
编写反序列化器
这是一个如何为 JodaTime DateTime 类编写自定义反序列化器的示例。
private class DateTimeDeserializer implements
JsonDeserializer<DateTime> {
public DateTime deserialize(JsonElement
json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
return new DateTime(json.getAsJsonPrimitive().getAsString());
}
}
Gson 在需要将 JSON 字符串片段反序列化为 DateTime 对象时调用 fromJson()