【发布时间】:2021-11-08 16:43:29
【问题描述】:
我正在实现一个应用程序,它以 json 格式从 certin endponts 获取数据并尝试将 tem 反序列化为 Java 对象,但我在解析 JSON 中的日期时遇到问题。这就是 JSON 中日期的样子: "/Date(1633122000000+0300)/" 我在谷歌中找不到如何成功解析这种格式的信息。
{
"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;
}
}
但它不能正常工作。我得到以下异常:
连接到目标VM,地址:'127.0.0.1:52760',传输:'socket' SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”。 SLF4J:默认为无操作(NOP)记录器实现 SLF4J:有关详细信息,请参阅http://www.slf4j.org/codes.html#StaticLoggerBinder。 线程“主”com.fasterxml.jackson.databind.JsonMappingException 中的异常:java.text.ParseException:无法解析的日期:“/Date(1633035600000+0300)/”(通过引用链:java.util.ArrayList[0]-> com.dataart.forecasts.pojo.timebydate.TimeByDateSheet["Date"]) 在 com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:392) 在 com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:351) 在 com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1821) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:315) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:176) 在 com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:355) 在 com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244) 在 com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28) 在 com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322) 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4675) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3630) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3613) 在 com.dataart.forecasts.DataProcessor.deserializeTimeByDateSheetsList(DataProcessor.java:198) 在 com.dataart.forecasts.ForecastReportApplication.main(ForecastReportApplication.java:50) 引起:java.lang.RuntimeException: java.text.ParseException: Unparseable date: "/Date(1633035600000+0300)/" 在 com.dataart.forecasts.DateDeserializer.deserialize(DateDeserializer.java:28) 在 com.dataart.forecasts.DateDeserializer.deserialize(DateDeserializer.java:16) 在 com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:313) ... 10 更多 引起:java.text.ParseException:无法解析的日期:“/Date(1633035600000+0300)/” 在 java.base/java.text.DateFormat.parse(DateFormat.java:395) 在 com.dataart.forecasts.DateDeserializer.deserialize(DateDeserializer.java:26) ... 13 更多
请有人帮助我。我在互联网上搜索了很多,但找不到解决方案。 先感谢您! :)
【问题讨论】:
-
我建议你不要使用
SimpleDateFormat和Date。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time API 的OffsetDateTime和DateTimeFormatter。
标签: java date parsing deserialization