嗨,我正在尋求幫助,以前我曾經將我的日期時間欄位作為2022-06-30T22:39:22.235 0000
格式,但在添加一個內部庫(組織級別)之后,日期時間欄位就像1656628762235
在 json 回應中一樣。
我嘗試添加@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
我的 dto 級別,但沒有運氣,我也嘗試在 yaml 檔案中添加以下屬性。
spring.jackson.serialization.write-dates-as-timestamps: true
jackson-datatype-jsr310 版本是:2.9.10
jackson-databind:2.9.10
spring-boot-2.1.11.RELEASE
請建議我可以嘗試以iso格式獲取時間戳的其他選項。
@Setter
@Getter
public class TestRequestFormDto implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private UUID trfId;
private String testType;
private ItemDto item;
private List<RepItemsMappingDto> repItems;
private AdditionalQuestionsDto additionalQuestions;
private String hasRepItems;
private TestRequestInfoDto testRequestInfo;
private ItemInformationDto itemInformation;
private LabDto lab;
private Timestamp createdDate;
private String createdBy;
private String status;
private Timestamp modifiedDate;
private String modifiedBy;
private String pageLeftFrom;
private String referenceNumber;
private TrfVendorDto trfVendor;
private TrfFactoryDto trfFactory;
private String originCountry;
private String itemsVbu;
private String versionNumber;
}
previous date format:
{"createdDate": "2022-06-30T22:39:22.235 0000"}
current date format:
{"createdDate": 1656628762235}
uj5u.com熱心網友回復:
使用現代時間 API
java.util.Date
它的子類是遺留的。
自Java 8(大約 10 年前發布)以來,我們擁有現代 Time API,其中Instant
包括.LocalDateTime
java.time package
java.sql.Timestamp
以及Date
已過時且不鼓勵使用。
建議您java.time.Instant
改用(如果您有能力更改 DTO 中的型別)。
秒到瞬間
如果您的時間戳以秒為單位表示,那么任務將很簡單(不幸的是,它不是,但為了完整起見,我將描述這個選項)。
在這種情況下,您需要JavaTimeModule
在 Spring Contexts 中有一個 Bean 型別。Spring-Boot 將為您完成剩下的作業。JacksonAutoConfiguration
將抓取模塊并自動注冊。
@Configuration
public class JsonConfig {
@Bean
public JavaTimeModule javaTimeModule() {
return new JavaTimeModule();
}
}
注意:如果目標欄位是型別,則Instant
不需要額外的注釋。
毫秒到瞬間
如果您的時間戳以毫秒表示并且自動配置不起作用(您可以嘗試一下,決議的日期將在未來很遠)。
為了解決這個問題,我們需要ObjectMapper
手動配置,注冊JavaTimeModule
模塊并告訴mapper時間戳的精度。Jackson2ObjectMapperBuilder
為此,需要ObjectMapper
在 Spring 的背景關系中放置兩個 Bean。
@Configuration
public class JsonConfig {
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
return new Jackson2ObjectMapperBuilder();
}
@Bean
public ObjectMapper objectMapper() {
return jackson2ObjectMapperBuilder()
.build()
.registerModule(new JavaTimeModule())
.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
}
}
正如我之前所說,不需要額外的步驟,也不需要對欄位進行額外的注釋(除非屬性名稱不匹配)。
使用示例:
輸入 JSON:
{"timestamp": 1656628762235}
輸出:
[2022,6,30,22,39,22,235000000]
如果您無法更改資料型別
如果您被迫使用舊的日期時間表示,作為最后的手段,這里有幾個可能的解決方案:
您可以在 POJO中宣告所有引數的建構式
@JsonProperty
,并使用. 訣竅是宣告相應的型別引數并手動long
決議毫秒。java.sql.Timestamp
但是從您擁有的欄位數量來看,這種方法看起來并不是最好的選擇。另一種選擇是實作自定義
Deserializer
并使用注釋對型別欄位進行Timestamp
注釋@JsonDeserialize
。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/513575.html
標籤:爪哇json杰克逊时间戳
上一篇:JSON欄位的多個名稱