杰克逊用时间戳字段反序列化JSON

时间:2017-04-12 15:04:57

标签: java json serialization jackson timestamp

我有这样的字符串:

{
   "debug":"false", 
   "switchTime":"2017-04-12 17:04:42.896026"
}

我正试图以这种方式获得对象:

new ObjectMapper().readValue(string, MyObject.class);

和MyObject类:

class MyObject {
    private Boolean debug;
    private Timestamp switchTime;
    //...getters, setters, constructors
}

我有这样的例外:

com.fasterxml.jackson.databind.exc.InvalidFormatException: 
Can not deserialize value of type java.sql.Timestamp from String
"2017-04-12 17:04:42.896026": not a valid representation (error:
Failed to parse Date value '2017-04-12 17:04:42.896026': 
Can not parse date "2017-04-12 17:04:42.896026Z": while it seems 
to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS'Z'', 
parsing fails (leniency? null))  at [Source:   
{"debug":"false", "switchTime":"2017-04-12 17:04:42.896026"}; 

我不明白为什么......如果我在调试模式下使用Timestamp.valueOf()和“2017-04-12 17:04:42.896026” - 我有成功

4 个答案:

答案 0 :(得分:21)

我认为您需要使用FOR XML AUTO, ELEMENTS注释设置预期的日期/时间格式,如下所示。

@JsonFormat

您还可以将时区设置为class MyObject { private Boolean debug; @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS") private Timestamp switchTime; //...getters, setters, constructors }

答案 1 :(得分:1)

首先将时间戳作为字符串,然后转换为所需的时间戳模式。

class MyObject {
  private Boolean debug;
  private String switchTime;
  //...getters, setters, constructors
}

使用follweing代码将字符串转换为所需的时间戳格式

try{
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
    Date parsedDate = dateFormat.parse(switchTime);
    Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime());
    }catch(Exception e){
    }

答案 2 :(得分:0)

您在调试模式中看到的值是“toString()”版本的实际时间戳值,因此不要依赖于您在调试模式下检查的内容。 您可以使用@JsonFormat注释来帮助您使用指定的格式转换时间戳。在转换时你也需要关注时区!

答案 3 :(得分:0)

当我在带有@Builder@Value批注的POJO类中使用lombok时,遇到了类似的问题

我还添加了注释AllArgsConstructor,然后它与我的自定义反序列化器代码一起正常工作