我有一個 JSON 資料物件類,如下所示:
public class Plugins {
private String id;
private String name;
@JsonProperty("created_at")
private long createdAt;
}
createdAt創建日期的長時間戳在哪里。我使用這個類來備份ObjectMapper從外部 API 呼叫決議 JSON 資料的 Jackson 物件。我想知道是否可以讓 Jacksoncreated_at自動轉換為可讀的日期格式并以 Java 的形式存盤在 Java中String?Date
uj5u.com熱心網友回復:
是否可以讓 Jackson 自動轉換為可讀的日期格式并以 Java格式
created_at存盤String?Date
Date已過時且不鼓勵使用。
自 Java 8(大約 10 年前發布)以來,我們擁有現代的 Time API,其中包括Instant,LocalDateTime和java.time包中的其他類。
您可以更改 POJO 以使其正確存盤日期時間資訊,而無需更改 JSON 有效負載。即created_at可以作為long值接收1665148545并轉換為ZonedDateTime(或其他日期時間表示,如Istant, LocalDateTime)。
public class Plugins {
private String id;
private String name;
private ZonedDateTime createdAt;
public Plugins(@JsonProperty("id") String id,
@JsonProperty("name") String name,
@JsonProperty("created_at") long createdAt) {
this.id = id;
this.name = name;
this.createdAt = Instant.ofEpochSecond(createdAt)
.atZone(ZoneId.of("UTC"));
}
// getters, toString(), etc.
}
使用示例:
String json = """
{
"id": "1",
"name": "someName",
"created_at": 1665148545
}""";
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue(json, Plugins.class));
輸出:
lugins{id='1', name='someName', createdAt=2022-10-07T13:15:45}
uj5u.com熱心網友回復:
您只需要注冊JavaTimeModule模塊并使用Java-8時間包中所需的型別。看看下面的例子:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.Instant;
public class DateApp {
private final static JsonMapper JSON_MAPPER = JsonMapper.builder()
.enable(SerializationFeature.INDENT_OUTPUT)
.addModule(new JavaTimeModule())
.build();
public static void main(String[] args) throws Exception {
String json = "{\"id\": \"1\",\"name\":\"someName\",\"created_at\": 1665148545}";
Plugins plugins = JSON_MAPPER.readValue(json, Plugins.class);
System.out.println(plugins);
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Plugins {
private String id;
private String name;
@JsonProperty("created_at")
private Instant createdAt;
}
上面的代碼列印:
Plugins(id=1, name=someName, createdAt=2022-10-07T13:15:45Z)
uj5u.com熱心網友回復:
在杰克遜中使用自定義反序列化器
您可以使用自定義反序列化器實作從long 到 String 或 Date的日期轉換。此自定義反序列化器會將長值從 json 轉換為定義的日期格式(日期或字串)。
請注意:在這里,我已將 epoch 值轉換為 String 資料型別。如果需要 Date 資料型別,您可以相應地更改類的deserialize method實作CustomDateSerializer。
您需要對需要自定義反序列化的欄位使用以下注釋。
@JsonDeserialize(using = CustomDateSerializer.class)
請在下面找到代碼:
插件.java
public class Plugins {
private String id;
private String name;
@JsonDeserialize(using = CustomDateSerializer.class)
@JsonProperty("created_at")
private String createdAt;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCreatedAt() {
return createdAt;
}
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
@Override
public String toString() {
return "Plugins{"
"id='" id '\''
", name='" name '\''
", createdAt='" createdAt '\''
'}';
}
}
CustomDateSerializer.java
public class CustomDateSerializer extends StdDeserializer<String> {
public static String pattern = "dd MMM yyyy hh:mm:ss";
public CustomDateSerializer() {
this(StdDeserializer.class);
}
protected CustomDateSerializer(Class<?> c) {
super(c);
}
@Override
public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
SimpleDateFormat formatter = new SimpleDateFormat(pattern);
return formatter.format(new Date(jsonParser.getLongValue()));//change the implementation of deserialise method if date format is needed.
}
}
測驗.java
public class Test {
public static void main(String[] args) throws JsonProcessingException {
//For sample input json, here i have used Text Blocks feature available from JDK 15 to have the string in readable format.
String json = """
{
"id":"1",
"name":"test",
"created_at":1665158083000
}
""";
ObjectMapper mapper = new ObjectMapper();
Plugins test = mapper.readValue(json,Plugins.class);
System.out.println(test);
}
}
輸出:
Plugins{id='1', name='test', createdAt='07 Oct 2022 09:24:43'}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/512602.html
