如何使用objectMapper設定java.time.Instant的字串格式?
- 我有一個帶有 java.time.Instant的實體用於建立的資料欄位:
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class Item {
private String id;
private String url;
private Instant createdDate;
}
我使用com.fasterxml.jackson.databind.ObjectMapper將專案儲存為JSON格式,ObjectMapper將此欄位序列化為物件:
"createdDate": {
"epochSecond": 1502643595,
"nano": 466000000
}
一種解決方案是使用 jackson-modules-java8.然後您可以將JavaTimeModule新增到物件對映器:
ObjectMapper objectMapper = new ObjectMapper();
JavaTimeModule module = new JavaTimeModule();
objectMapper.registerModule(module);
預設情況下,Instant被序列化為紀元值(單個數字中的秒和納秒):
{"createdDate":1502713067.720000000}
您可以通過在物件對映器中設定來更改它:
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
這將產生輸出:
{"createdDate":"2017-08-14T12:17:47.720Z"}
上述兩種格式都是反序列化的,無需任何其他配置.
要更改序列化格式,只需在欄位中新增JsonFormat註釋:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Instant createdDate;
您需要設定時區,否則Instant無法正確序列化(它會引發異常).輸出將是:
{"createdDate":"2017-08-14 12:17:47"}
如果您不想(或不能)使用java8模組,另一種方法是使用java.time.format.DateTimeFormatter建立自定義序列化程式和反序列化程式:
public class MyCustomSerializer extends JsonSerializer<Instant> {
private DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneOffset.UTC);
@Override
public void serialize(Instant value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
String str = fmt.format(value);
gen.writeString(str);
}
}
public class MyCustomDeserializer extends JsonDeserializer<Instant> {
private DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneOffset.UTC);
@Override
public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return Instant.from(fmt.parse(p.getText()));
}
}
然後使用這些自定義類註釋該欄位:
@JsonDeserialize(using = MyCustomDeserializer.class)
@JsonSerialize(using = MyCustomSerializer.class)
private Instant createdDate;
輸出將是:
{"createdDate":"2017-08-14 12:17:47"}
一個細節是,在序列化字串中,您將丟棄秒的小數部分(小數點後的所有內容).因此,在反序列化時,此資訊無法恢復(它將被設定為零).
在上面的例子中,原始的Instant是2017-08-14T12:17:47.720Z,但是序列化的字串是2017-08-14 12:17:47(沒有秒的分數),所以當反序列化時產生的Instant是2017-08-14T12:17:47Z(丟失.720毫秒).
相關文章
- 如何使用 Python 進行字串格式化Python字串格式化
- Java使用ObjectMapper的簡單示例JavaObjectAPP
- linq如何設定連線資料庫的字串資料庫字串
- SpringBoot中如何使用ObjectMapper,老鳥們都是這樣玩的?Spring BootObjectAPP
- word標題格式怎麼設定 word標題格式設定的方法
- logrus的使用及格式定製
- JAVA字串格式化-String.format()的使用Java字串格式化ORM
- Nginx日誌格式設定Nginx
- Python中的字串與字串格式化Python字串格式化
- C# 使用JavaScript設定或驗證 PDF中的文字域格式C#JavaScript
- python字串的格式化Python字串
- 6. 二十不惑,ObjectMapper使用也不再迷惑ObjectAPP
- Python程式設計基礎:f-字串格式Python程式設計字串
- Open Office XML 格式裡如何描述多段具有不同字型設定的段落XML
- 格式化字串字串
- 字串 格式化字串
- IDEA如何設定編碼格式,字元編碼,全域性編碼和專案編碼格式Idea字元
- 基於ObjectMapper的本地快取ObjectAPP快取
- Python:字串格式化Python字串格式化
- Golang字串格式化Golang字串格式化
- Golang 字串 格式化Golang字串
- Python中的字串格式化方法Python字串格式化
- python字串格式化的方法整理Python字串格式化
- 如何使用 bind 設定 DNS 伺服器DNS伺服器
- win10 時間怎麼設定24小時格式_win10如何設定24小時制Win10
- word裡面設定三線表格式
- Notepad++設定json格式化工具JSON
- 【轉載】WPF中Binding使用StringFormat格式化字串方法ORM字串
- Python 使用者輸入和字串格式化指南Python字串格式化
- 使用Json.NET驗證json字串是否格式正確JSON字串
- python word 應用,設定 word 文件的內容格式Python
- javascript中如何判斷一個字串是否為JSON格式JavaScript字串JSON
- excel條件格式怎麼設定 excel條件格式在哪裡Excel
- Java設定JSON字串引數編碼JavaJSON字串
- 如何使用Linux使用者身份與程式許可權的設定?Linux
- ObjectMapper原始碼學習ObjectAPP原始碼
- macos 使用前的設定Mac
- 如何透過PHP將“if”新增到給定字串的前面PHP字串