📅  最后修改于: 2023-12-03 14:43:34.407000             🧑  作者: Mango
GSON是Google提供的Java序列化/反序列化库,用于将Java对象转换为JSON格式,或将JSON格式转换为Java对象。它可以轻松地将JSON字符串转换为Java对象,也可以将Java对象序列化为JSON字符串。
下面是将Java对象序列化为JSON字符串的示例:
Gson gson = new Gson();
MyObject myObject = new MyObject();
String json = gson.toJson(myObject);
下面是将JSON字符串反序列化为Java对象的示例:
Gson gson = new Gson();
MyObject myObject = gson.fromJson(json, MyObject.class);
GSON提供了一些注解来控制对象序列化和反序列化的行为。
@SerializedName注解用于指定对象属性在JSON格式中的名称。
例如,如果有一个Java对象:
class MyObject {
@SerializedName("theName")
String name;
int age;
}
则在将该对象序列化为JSON格式时,属性“name”将以名称“theName”出现。反之,反序列化JSON字符串时,“theName”将被映射到属性“name”。
@Expose注解用于指示是否将属性包括在序列化或反序列化的过程中。默认情况下,所有属性都包括在内。
例如,如果要将“MyObject”的“age”属性排除在序列化和反序列化之外,可以这样写:
class MyObject {
@SerializedName("theName")
String name;
@Expose(serialize = false)
int age;
}
@Since和@Until注解用于控制在序列化时包括或排除特定版本的属性。这对于在修改API时,需要对客户端进行版本迁移时特别有用。
例如,如果需要序列化时包括“age”属性,但只能在版本2.0及以上的客户端中使用,可以这样写:
class MyObject {
@SerializedName("theName")
String name;
@Expose
@Since(2.0)
int age;
}
此外,还可以使用@Until注解指定在某个版本之前要排除某个属性。
如果需要对特定类型进行自定义的序列化或反序列化操作,可以使用GSON提供的JsonSerializer和JsonDeserializer接口。
例如,如果需要将Date类型转换为字符串并反转回Date类型,则可以这样写:
class DateSerializer implements JsonSerializer<Date> {
private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
@Override
public JsonElement serialize(Date date, Type type, JsonSerializationContext jsonSerializationContext) {
String dateString = dateFormat.format(date);
return new JsonPrimitive(dateString);
}
}
class DateDeserializer implements JsonDeserializer<Date> {
private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
@Override
public Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
String dateString = jsonElement.getAsJsonPrimitive().getAsString();
try {
return dateFormat.parse(dateString);
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
}
然后将这两个自定义序列化器/反序列化器注册到GSON:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateSerializer())
.registerTypeAdapter(Date.class, new DateDeserializer())
.create();