How to serialize Date to long using gson?

后端 未结 2 1856
情歌与酒
情歌与酒 2021-02-19 05:26

I recently switched some of our serialization from Jackson to Gson. Found out that Jackson serializes dates to longs.

But, Gson serializes Date

相关标签:
2条回答
  • 2021-02-19 05:49

    First type adapter does the deserialization and the second one the serialization.

    Gson gson = new GsonBuilder()
            .registerTypeAdapter(Date.class, (JsonDeserializer<Date>) (json, typeOfT, context) -> new Date(json.getAsJsonPrimitive().getAsLong()))
            .registerTypeAdapter(Date.class, (JsonSerializer<Date>) (date, type, jsonSerializationContext) -> new JsonPrimitive(date.getTime()))
            .create();
    

    Usage:

    String jsonString = gson.toJson(objectWithDate1);
    ClassWithDate objectWithDate2 = gson.fromJson(jsonString, ClassWithDate.class);
    assert objectWithDate1.equals(objectWithDate2);
    
    0 讨论(0)
  • 2021-02-19 05:50

    You can do both direction with one type adapter:

    public class DateLongFormatTypeAdapter extends TypeAdapter<Date> {
    
        @Override
        public void write(JsonWriter out, Date value) throws IOException {
            if(value != null) out.value(value.getTime());
            else out.nullValue();
        }
    
        @Override
        public Date read(JsonReader in) throws IOException {
            return new Date(in.nextLong());
        }
    
    }
    

    Gson builder:

    Gson gson = new GsonBuilder()
            .registerTypeAdapter(Date.class, new DateLongFormatTypeAdapter())
            .create();
    
    0 讨论(0)
提交回复
热议问题