我正在實作一個應用程式,它以 json 格式從 certin 端點獲取資料,并嘗試將 tem 反序列化為 Java 物件,但我在決議 JSON 中的日期時遇到問題。這是日期在 JSON 中的樣子:“/ Date(1633122000000 0300)/" 并且我在 Google 中找不到如何成功決議此格式的資訊。
{
"Date": "/Date(1633122000000 0300)/",
"Filled": 0,
"Needed": 0,
"Paid": 0
}
這是我用來將資料反序列化為使用 Jackson ObjectMapper 的 pojo:
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TimeByDateSheet {
@JsonProperty("Date")
@JsonFormat(timezone = "GMT 03:00")
@JsonDeserialize(using = DateDeserializer.class, as=Date.class)
private Date date;
@JsonProperty("Filled")
private Long filled;
@JsonProperty("Needed")
private Long needed;
@JsonProperty("Paid")
private Integer paid;
}
這是我的 DateDeserializer:
@SuppressWarnings("serial")
public class DateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext context)
throws IOException, JsonProcessingException {
SimpleDateFormat simpleDateFormat =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zzz", Locale.getDefault());
String dateStr = jsonParser.getText();
Date date;
try{
date = simpleDateFormat.parse(dateStr);
}catch(ParseException e){
throw new RuntimeException(e);
}
return date;
}
}
但它不能正常作業。我收到以下例外:
Connected to the target VM, address: '127.0.0.1:52760', transport: 'socket' SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: java.text.ParseException: Unparseable date: "/Date(1633035600000 0300)/" (through reference chain: java.util.ArrayList[0]->com.dataart.forecasts.pojo.timebydate.TimeByDateSheet["Date"]) at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:392) at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:351) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1821) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:315) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:176) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:355) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244) at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28) at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4675) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3630) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3613) at com.dataart.forecasts.DataProcessor.deserializeTimeByDateSheetsList(DataProcessor.java:198) at com.dataart.forecasts.ForecastReportApplication.main(ForecastReportApplication.java:50) Caused by: java.lang.RuntimeException: java.text.ParseException: Unparseable date: "/Date(1633035600000 0300)/" at com.dataart.forecasts.DateDeserializer.deserialize(DateDeserializer.java:28) at com.dataart.forecasts.DateDeserializer.deserialize(DateDeserializer.java:16) at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:313) ... 10 more Caused by: java.text.ParseException: Unparseable date: "/Date(1633035600000 0300)/" at java.base/java.text.DateFormat.parse(DateFormat.java:395) at com.dataart.forecasts.DateDeserializer.deserialize(DateDeserializer.java:26) ... 13 more
有人可以幫我嗎,請。我在互聯網上搜索了很多,但找不到解決方案。先感謝您!:)
uj5u.com熱心網友回復:
生成 JSON 似乎存在問題。我真的不認為你想要這樣格式化日期。現在,您有一些奇怪的文本圍繞著以毫秒為單位的 unix 時間戳,后跟區域偏移量。您還在使用舊的、令人反感的 Date 和 SimpleDateFormat 類,而不是較新的java.timeAPI。但是,可以反序列化您的日期格式。這是一種方法:
public class DateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext context)
throws IOException, JsonProcessingException {
Pattern pattern = Pattern.compile("/Date\\((\\d )([ -]\\d )\\)/");
Matcher matcher = pattern.matcher(jsonParser.getText());
if (matcher.find()) {
String timestamp = matcher.group(1);
String offset = matcher.group(2);
Instant instant = Instant.ofEpochMilli(Long.parseLong(timestamp));
ZonedDateTime zdt = instant.atZone(ZoneId.of(offset));
instant = zdt.toInstant();
return Date.from(instant);
} else {
throw new RuntimeException("Invalid format: " jsonParser.getText());
}
}
}
uj5u.com熱心網友回復:
@DavidConrad 謝謝,我會嘗試您的解決方案。順便說一下,現在我做了一個對我有用的解決方法:
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
SimpleDateFormat dateFormattter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = jsonParser.getText();
String timeZone = dateStr.substring(dateStr.indexOf(" ") 1, dateStr.indexOf(")"));
String timeZoneShift = String.format("%s:%s",
timeZone.substring(0, timeZone.length()/2),
timeZone.substring(timeZone.length()/2));
dateFormattter.setTimeZone(TimeZone.getTimeZone(String.format("GMT %s", timeZoneShift)));
Long millis = 0L;
if (dateStr.contains(" ") && !dateStr.contains("-")) {
millis = Long.parseLong(dateStr.substring(dateStr.indexOf("(") 1, dateStr.indexOf(" ")));
} else if (dateStr.contains(" ") && !dateStr.contains("-")) {
millis = Long.parseLong(dateStr.substring(dateStr.indexOf("(") 1, dateStr.indexOf(")")));
}
Date date = new Date(millis);
String stringDate= dateFormattter.format(date);
try {
date = dateFormattter.parse(stringDate);
} catch (ParseException e) {
throw new RuntimeException(e);
}
return date;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/354812.html
下一篇:用公共前綴區分規則
