web-dev-qa-db-ja.com

ジャクソンはタイムスタンプフィールドで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"}; 

理由がわかりません...「2017-04-12 17:04:42.896026」を使用してデバッグモードTimestamp.valueOf()で使用すると、成功します

11
Kiril Mytsykov

以下に示すように、_@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")として設定することもできます

17
Justin Jose

まず、タイムスタンプを文字列として取得し、次に目的のタイムスタンプパターンに変換します。

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

デバッグモードで表示される値は、タイムスタンプの実際の値の「toString()」バージョンであるため、デバッグモードでの検査に依存しないでください。 @JsonFormatアノテーションを使用すると、タイムスタンプを指定した形式に変換できます。変換中もタイムゾーンに注意する必要があります!

0
adi