java - 给定类的 Gson 序列化器(如果在另一个特定类中)

标签 java serialization gson

我正在尝试序列化(使用 Gson)POJO 并对其单个字段进行特殊处理。

是否可以用一种更简单的方式来实现这一点,而不是编写一个实现 JsonSerializer 的适配器,并让其 serialize() 方法复制除接收的特定字段之外的每个字段特殊待遇?

是否可以在我的 POJO 中使用注释来实现它?

我也不能只编写特定字段类型的适配器,因为它是 java.util.Date 并且我不希望每个序列化日期都接受这种处理。

<小时/>

这是一个例子:

public class Pojo {

    @SerializedName("effectiveDate")
    private final Date mDate;

    @SerializedName("status")
    private final Status mStatus; // <-- The field needing specific serialization

    @SerializedName("details")
    private final String mDetails;

    // other fields

    // methods
}

我想避免对适配器进行这样的编码:

public class PojoAdapter implements JsonSerializer<Pojo> {

    @Override
    public JsonElement serialize(final Pojo src, final Type typeOfSrc, final JsonSerializationContext context) {
        final JsonObject jsonPojo = new JsonObject();
        jsonDeployment.add("effectiveDate", /* special treatment */);        
        jsonDeployment.add("status", src.getStatus());
        jsonDeployment.add("details", src.getDetails());
        // other fields setting
        return jsonPojo;
    }
}

最佳答案

您可以为 Date 类实现自定义 com.google.gson.JsonSerializer 并使用 com.google.gson.annotations.JsonAdapte给定字段的注释以注册它。请参阅下面的示例:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;

import java.lang.reflect.Type;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class GsonApp {

    public static void main(String[] args) {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        System.out.println(gson.toJson(new DatesPojo(new Date())));
    }

}

class CustomDateJsonSerializer implements JsonSerializer<Date> {
    @Override
    public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
        String format = src.toInstant().atZone(ZoneId.systemDefault()).format(DateTimeFormatter.ISO_TIME);
        return new JsonPrimitive(format + " ISO TIME");
    }
}

class DatesPojo {

    @JsonAdapter(CustomDateJsonSerializer.class)
    @SerializedName("customDate")
    private final Date mDate0;

    @SerializedName("effectiveDate")
    private final Date mDate1;

    public DatesPojo(Date mDate) {
        this.mDate0 = mDate;
        this.mDate1 = mDate;
    }

    public Date getmDate0() {
        return mDate0;
    }

    public Date getmDate1() {
        return mDate1;
    }
}

上面的代码打印:

{
  "customDate": "22:37:21.806+01:00 ISO TIME",
  "effectiveDate": "Jan 22, 2020 10:37:21 PM"
}

关于java - 给定类的 Gson 序列化器(如果在另一个特定类中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59844365/

相关文章:

java - 如何使用 Gson 将 JSON 字符串属性读取到自定义类对象中?

java - ProGuard 混淆、java、Google Gson 和通用集合——如何保留成员?

java - 要求用户输入整数,然后对它们进行计数

java - SimpleJdbcCall 参数不将 null 作为 NULL 值插入

java - 二进制序列化协议(protocol)

c# - 如果我在子类中实现 ISerializable,父类是否也必须如此?

java - 改造错误 JSONSyntaxException

java - 查找上午 8 点的时区名称

java - 是否可以在不同的运行时间访问本地存储的静态变量

c# - 如何在 Windows 10 通用应用程序中使用 xsd.exe 生成的文件