本文介绍了GsonBuilder序列化器将时间戳和日期弄乱了的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经使用Gson将模型类序列化和反序列化为json字符串,但是问题是gson将日期变量带到时间戳序列化器中.我的类同时包含Date和Timestamp变量,但是都由同一个Timestamp序列化器序列化.我的GsonBuilder中的时间戳和日期序列化程序都在下面.

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:

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;
        }
    }

下面是我的gson序列化器

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();
    }

问题是dob和createdBy都将进入TimeStamp序列化程序.我想要的是dob应该转到Date序列化器,并创建到TimeStamp序列化器.请帮助我.

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.

推荐答案

请以此方式使用单独的序列化/反序列化类.

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);
    }
}

用法:

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

这篇关于GsonBuilder序列化器将时间戳和日期弄乱了的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-02 11:30