【问题标题】:Can not construct instance of java.util.Date from String value '/Date(1458672480000)/'无法从字符串值 '/Date(1458672480000)/' 构造 java.util.Date 的实例
【发布时间】:2016-04-04 11:14:45
【问题描述】:

我一直在尝试淡化包含 Date 的 JSON 字符串,但出现以下异常-

org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '/Date(1458672480000)/': not a valid representation (error: Unparseable date: "/Date(1458672480000)/" (at offset 0))
 at [Source: java.io.StringReader@32e26583; line: 1, column: 199] 

代码详情如下-

数据模型-

@JsonIgnoreProperties(ignoreUnknown = true)
    public class DataModel {
        public Integer Capacity;
        public Long Id;
        public String Name;
        public Date StartDate;
        public Date EndDate;
        public String Message;
        public Integer LocationId;
        public Boolean IsValid;
        public Integer[] NickNames = new Integer[0];

    }

JSON 字符串-

{"d":[{"__type":"my.package.name.className","Id":1,"Name":"xxx","PlaceId":2,"Message":"","IsValid":false,"NickNames":[],"StartDate":"\/Date(1458672480000)\/","EndDate":"\/Date(1458689400000)\/","Size":0,"StringStartDate":"2016-03-22T14:48:00-04:00","StringEndDate":"2016-03-22T19:30:00-04:00"}]}

反序列化代码-

ObjectMapper mapper = new ObjectMapper();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
mapper.setDateFormat(dateFormat);
mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
TypeReference<HashMap<String,DataModel[]>> typeRef= new TypeReference<HashMap<String,DataModel[]>>(){};
HashMap<String,DataModel[]> newSessions = mapper.readValue(data, typeRef);

JSON 字符串有问题吗?如果不是,反序列化的正确方法是什么?

【问题讨论】:

  • 1458672480000 而不是 Date(1458672480000)?
  • 您的 json 中有一个名为 StringStartDate 的字段,其中包含您所期望的数据。但是,该字段不会出现在您的 DataModel 中。 json 中的 StartDate 字段包含无效内容,因此无法反序列化为 java.util.Date

标签: java android json jackson


【解决方案1】:

新的Date 对象的构造函数是Date(long millis)。但是您将这个字符串传递给它 - "Date(1458672480000)"

从此 String 中获取 long 值,然后创建 Date 对象。假设你的 startDate 是 "Date(1458672480000)" 然后 -

Date d = new Date(Long.parseLong(startDate.substring(5, 18)));

这里我们提取字符串的数字部分并将其转换为long 类型。

理想情况下,如果您的服务器直接向您发送long 值会更好,这样您就不必解析它。如果long 日期值像这样直接以 json 形式出现 - "startDate": 1458672480000,那么您的代码将会完美运行。

【讨论】:

  • 最后一部分是正确的做法。我以前从未见过序列化为Date(1458672480000) 的日期。
  • 感谢您的回答。此行引发异常 - HashMap&lt;String,SessionModel[]&gt; newSessions = mapper.readValue(data, typeRef);,其中 data 是 JSON 字符串。现在,我在哪里写这行 - Date d = new Date(Long.parseLong(startDate.substring(5, 18)));
  • 我不认为你可以这样做。您唯一的选择是通过这种方式制作 StartDate 和 EndDate 字符串类型。然后在您想使用我的答案中的代码使用它们时将它们转换为日期。或者接受我最后一行答案中的建议
  • 非常感谢。我会尝试这两种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2015-06-05
  • 2019-06-14
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多