📜  json 到对象 gson - Java (1)

📅  最后修改于: 2023-12-03 14:43:34.407000             🧑  作者: Mango

JSON到对象GSON - Java

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

@SerializedName注解用于指定对象属性在JSON格式中的名称。

例如,如果有一个Java对象:

class MyObject {
    @SerializedName("theName")
    String name;
    int age;
}

则在将该对象序列化为JSON格式时,属性“name”将以名称“theName”出现。反之,反序列化JSON字符串时,“theName”将被映射到属性“name”。

@Expose

@Expose注解用于指示是否将属性包括在序列化或反序列化的过程中。默认情况下,所有属性都包括在内。

例如,如果要将“MyObject”的“age”属性排除在序列化和反序列化之外,可以这样写:

class MyObject {
    @SerializedName("theName")
    String name;
    @Expose(serialize = false)
    int age;
}
@Since和@Until

@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();