Gson Serializer для данного класса, если в другом указанном c классе - PullRequest
3 голосов
/ 21 января 2020

Я пытаюсь сериализовать (используя Gson) POJO и провести специальную обработку для одного из его полей.

Возможно ли сделать это более простым способом, чем кодирование адаптера, реализующего JsonSerializer и имеющего метод serialize(), для копирования всех полей, кроме указанного c, которое получает специальную обработку?

Можно ли сделать это, используя аннотации в моем POJO?

Я также не могу просто написать адаптер типа поля спецификаций c, так как это 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;
    }
}

Ответы [ 2 ]

1 голос
/ 23 января 2020

Вы можете реализовать пользовательский com.google.gson.JsonSerializer для класса Date и использовать аннотацию 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"
}
0 голосов
/ 23 января 2020

Я нашел другое решение, заключающееся в том, чтобы мое поле Date реализовало интерфейс EffectiveDate, который просто расширяет Date, и добавил адаптер для этого единственного поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...