2017-04-12 204 views
2

我有这样的字符串:杰克逊反序列化JSON与时间戳字段

{ 
    "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年4月12日17:04:42.896026”使用 - 我有成功

回答

3

我认为你需要使用@JsonFormat注释设置预期的日期/时间格式,如下所示。

class MyObject { 
    private Boolean debug; 
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS") 
    private Timestamp switchTime; 
    //...getters, setters, constructors 
} 

您还可以设置时区为@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS",timezone="PST")

0

您在调试模式下看到的值为“的toString()”时间戳的实际值的版本,所以不依赖于你在调试检查什么模式。 您可以使用@JsonFormat注释来帮助您将指定格式的时间戳转换。转换时您还需要照顾时区!

1

首先获取时间戳作为字符串,然后转换为所需的时间戳模式。使用follweing代码

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

字符串转换为期望的时间戳格式

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