GsonBuilder serializer mess up with Timestamp and Date

心已入冬 提交于 2019-12-11 17:49:02

问题


I have used Gson to serialize and deserialize model class to json string , but the problem is gson takes date variabless to timestamp serializer.My class contain both Date and Timestamp variables but both are serialized by the same Timestamp serializer.I have wrote both Timestamp and date serializer in my GsonBuilder.Below is my class

StaffDetails.java :

        import javax.persistence.*;
    import java.io.Serializable;
    import java.sql.Timestamp;
    import java.util.Date;
    import java.util.Locale;

    @Entity
    @Table(name = "staff_details")
    public class StaffDetails implements Serializable {

        @Id
        @GeneratedValue
        @Column(name = "id")
        private Long id;

        @Column(name="address")
        private String address;

        @Column(name = "name")
        private String name;

        @Column(name = "age")
        private Integer age;

        @Column(name = "dob")
        private Date dob;

        @Column(name="created_by")
        private Long createdBy;

        @Column(name="created_on")
        private Timestamp createdOn;

        public StaffDetails() {

        }

        public StaffDetails(Long id, String address, String name, Integer age, Date dob, Long createdBy, Timestamp createdOn) {
            this.id = id;
            this.address = address;
            this.name = name;
            this.age = age;
            this.dob = dob;
            this.createdBy = createdBy;
            this.createdOn = createdOn;
        }

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public String getAddress() {
            return address;
        }

        public void setAddress(String address) {
            this.address = address;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public Date getDob() {
            return dob;
        }

        public void setDob(Date dob) {
            this.dob = dob;
        }

        public Long getCreatedBy() {
            return createdBy;
        }

        public void setCreatedBy(Long createdBy) {
            this.createdBy = createdBy;
        }

        public Timestamp getCreatedOn() {
            return createdOn;
        }

        public void setCreatedOn(Timestamp createdOn) {
            this.createdOn = createdOn;
        }
    }

Below is my gson serializer

        String jsonAccts = null;
    SimpleDateFormat dtf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
    SimpleDateFormat dtfDate=new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
    try{
    GsonBuilder builder = new GsonBuilder();

        builder.registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
            @Override
            public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
                String jsDate = dtfDate.format(src);
                return new JsonPrimitive(jsDate);
            }
        });
        builder.registerTypeAdapter(Timestamp.class, new JsonSerializer<Timestamp>() {
            @Override
            public JsonElement serialize(Timestamp src, Type typeOfSrc, JsonSerializationContext context) {
                String jsDate = dtf.format(src);
                return new JsonPrimitive(jsDate);
            }
        });
        Gson gson = builder.create();
        Type listType = new TypeToken<List<StaffDetails>>() {}.getType();
        List<StaffDetails> staffDetailsList = new ArrayList<StaffDetails>();
        staffDetailsList = loopDao.getStaffLeaveList(customUser.getId());
        jsonAccts = gson.toJson(staffDetailsList, listType);
    }catch(Exception e){
        e.printStackTrace();
    }

The problem is both dob and createdBy are going to TimeStamp serializer. What i want is dob should go to Date serializer and createdBy to TimeStamp serializer.Please help me.


回答1:


Please use separate Serialize / de-Serialize classes as this.

public class LocalDateDeserializer extends StdDeserializer<LocalDate> {

    private static final long serialVersionUID = 1L;

    protected LocalDateDeserializer() {
        super( LocalDate.class );
    }

    @Override
    public LocalDate deserialize( JsonParser jp, DeserializationContext ctxt ) {
        try {
            return LocalDate.parse( jp.readValueAs( String.class ) );
        }
        catch (Exception e) {
            // TODO: handle exception
            return null;
        }
    }
}


public class LocalDateSerializer extends StdSerializer<LocalDate>
{

    private static final long serialVersionUID = 1L;

    public LocalDateSerializer()
    {
        super( LocalDate.class );
    }

    @Override
    public void serialize( LocalDate value, JsonGenerator gen, SerializerProvider sp ) throws IOException, JsonProcessingException
    {
        gen.writeString( value.format( DateTimeFormatter.ISO_LOCAL_DATE ) );
    }
}

public class LocalDateTimeDeserializer extends StdDeserializer<LocalDateTime> {

    private static final long serialVersionUID = 1L;

    protected LocalDateTimeDeserializer() {
        super( LocalDateTime.class );
    }

    @Override
    public LocalDateTime deserialize( JsonParser jp, DeserializationContext ctxt ) {
        try {
            return LocalDateTime.parse( jp.readValueAs( String.class ), DateTimeFormatter.ISO_DATE_TIME.withZone(ZoneId.of("UTC")) );
        }
        catch (Exception e) {
            // TODO: handle exception
            return null;
        }
    }
}


public class LocalDateTimeSerializer extends StdSerializer<LocalDateTime> {

    private static final long serialVersionUID = 1L;

    public LocalDateTimeSerializer() {
        super(LocalDateTime.class);
    }

    @Override
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider sp) throws IOException {
        String isoLocalDateTimeString = value.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + ".000Z";
        gen.writeString(isoLocalDateTimeString);
    }
}

Usage:

@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime time;
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate date;


来源:https://stackoverflow.com/questions/50713285/gsonbuilder-serializer-mess-up-with-timestamp-and-date

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!