Есть ли аналог GsonFormat в Gson? - PullRequest
3 голосов
/ 29 октября 2019

Мой вопрос очень маленький:

Мне нравится Gson чуть больше, чем fastrxml.jackson. Одна возможная особенность, которую я хотел бы видеть в Gson, заключается в следующем:

//some code
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
private Date endDate;
//some code

единственный способ сделать то же самое в Gson, который я нашел:

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();

Я думаю, что аннотациилучше понятно, чем выше инициализация. Есть ли способ аннотировать или сделать какое-нибудь свойство, чтобы код

gson.fromJson("\"{\\\"Id\\\": 703,\\\"StartDate\\\": \\\"2019-10-01T00:00:00\\\"," +
    " \\\"EndDate\\\": \\\"2019-10-25T00:00:00\\\",\\\"Title\\\": \\\"exmample title\\\"}\"",
  MyObj.class)

производил объект класса MyObj:

public class MyObj{
    @SerializedName("Id")
    private Long id;
    @SerializedName("StartDate")
    //analogue of JsonFormat????
    private Date startDate;
    @SerializedName("EndDate")
    //analogue of JsonFormat????
    private Date endDate;
    @SerializedName("Title")
    private String title;
}

1 Ответ

1 голос
/ 02 ноября 2019

Для десериализации JSON до POJO Gson используется класс com.google.gson.internal.bind.ReflectiveTypeAdapterFactory, помеченный как final. Для обработки дополнительной аннотации вам необходимо реализовать нечто подобное, плюс создать новую аннотацию и обрабатывать ее в логике десериализации. Прямо сейчас вы можете реализовать свой пользовательский com.google.gson.JsonDeserializer, который позволяет анализировать заданную дату.

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;

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

public class GsonApp {

    public static void main(String[] args) {
        Gson gson = new GsonBuilder().create();
        MyObj myObj = gson.fromJson(
                "{\"Id\": 703,\"StartDate\": \"2019-10-01T00:00:00\",\"EndDate\": \"2019-10-25T00:00:00\",\"Title\": \"exmample title\"}",
                MyObj.class);
        System.out.println(myObj);
    }
}

class IsoDateTimeJsonDeserializer implements JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        LocalDateTime localDateTime = LocalDateTime.parse(json.getAsString(), DateTimeFormatter.ISO_DATE_TIME);

        return Date.from(localDateTime.atZone(ZoneOffset.systemDefault()).toInstant());
    }
}

class MyObj {

    @SerializedName("Id")
    private Long id;

    @SerializedName("StartDate")
    @JsonAdapter(IsoDateTimeJsonDeserializer.class)
    private Date startDate;

    @SerializedName("EndDate")
    @JsonAdapter(IsoDateTimeJsonDeserializer.class)
    private Date endDate;

    @SerializedName("Title")
    private String title;

    // getters, setters, toString
}

Над отпечатками кода:

MyObj{id=703, startDate=Tue Oct 01 00:00:00 CEST 2019, endDate=Fri Oct 25 00:00:00 CEST 2019, title='exmample title'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...