JSON Serializing date in a custom format (Can not construct instance of java.util.Date from String value)

后端 未结 6 1417
野的像风
野的像风 2020-12-03 07:01
could not read JSON: Can not construct instance of java.util.Date from String 
value \'2012-07-21 12:11:12\': not a valid representation(\"yyyy-MM-dd\'T\'HH:mm:ss.SS         


        
相关标签:
6条回答
  • 2020-12-03 07:27

    I have the same problem, so I write a custom date deserialization with @JsonDeserialize(using=CustomerDateAndTimeDeserialize.class)

    public class CustomerDateAndTimeDeserialize extends JsonDeserializer<Date> {
    
        private SimpleDateFormat dateFormat = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss");
    
        @Override
        public Date deserialize(JsonParser paramJsonParser,
                DeserializationContext paramDeserializationContext)
                throws IOException, JsonProcessingException {
            String str = paramJsonParser.getText().trim();
            try {
                return dateFormat.parse(str);
            } catch (ParseException e) {
                // Handle exception here
            }
            return paramDeserializationContext.parseDate(str);
        }
    }
    
    0 讨论(0)
  • 2020-12-03 07:27

    For someone ,If you are using DTO/VO/POJO to map your request you can simply annotate your date field

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date customerRegDate;
    

    And json request should be:

    {
    "someDate":"2020-04-04 16:11:02"
    }
    

    You don't need to annotate Entity class variable.

    0 讨论(0)
  • 2020-12-03 07:28

    I solved this by using the below steps.

    1.In entity class annote it using @JsonDeserialize

    @Entity
    @Table(name="table")
    public class Table implements Serializable {
    // Some code
    @JsonDeserialize(using= CustomerDateAndTimeDeserialize.class)
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="created_ts")
    private Date createdTs
    }
    
    1. Write CustomDateAndTimeDeserialize.java Sample Code
    0 讨论(0)
  • 2020-12-03 07:40

    Yet another way is to have a custom Date object which takes care of its own serialization.

    While I don't really think extending simple objects like Date, Long, etc. is a good practice, in this particular case it makes the code easily readable, has a single point where the format is defined and is rather more than less compatible with normal Date object.

    public class CustomFormatDate extends Date {
    
        private DateFormat myDateFormat = ...; // your date format
    
        public CustomFormatDate() {
            super();
        }
    
        public CustomFormatDate(long date) {
            super(date);
        }
    
        public CustomFormatDate(Date date) {
            super(date.getTime());
        }
    
    
        @JsonCreator
        public static CustomFormatDate forValue(String value) {
            try {
                return new CustomFormatDate(myDateFormat.parse(value));
            } catch (ParseException e) {
                return null;
            }
        }
    
        @JsonValue
        public String toValue() {
            return myDateFormat.format(this);
        }
    
        @Override
        public String toString() {
            return toValue();
        }
    }
    
    0 讨论(0)
  • 2020-12-03 07:42

    Annotate your created_date field with the JsonFormat annotation to specify the output format.

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = TimeZone.getDefault(), locale = Locale.getDefault())
    

    Note that you may need to pass in a different Locale and TimeZone if they should be based on something other than what the server uses.

    You can find out more information in the docs.

    0 讨论(0)
  • 2020-12-03 07:43
    1. If you want to bind a JSON string to date, this process is called deserialization, not serialization.
    2. To bind a JSON string to date, create a custom date deserialization, annotate created_date or its setter with

      @JsonDeserialize(using=YourCustomDateDeserializer.class)

    where you have to implement the method public Date deserialize(...) to tell Jackson how to convert a string to a date.

    Enjoy.

    0 讨论(0)
提交回复
热议问题