JSON Jackson ObjectMapper ReadValue - 转换日期

时间:2015-10-13 22:00:13

标签: java json jackson spring-boot

我在尝试将json字符串转换为对象时看到下面列出的错误。我没有Data class&的源代码。它是jar文件的一部分。我有没有办法使用mixins来解决这个问题?

CODE

ObjectMapper mapper = new ObjectMapper();
mapper.readValue(request, Data.class);

错误

  

org.codehaus.jackson.map.JsonMappingException:无法构造   来自String值的javax.xml.datatype.XMLGregorianCalendar的实例   '10:00:00':不是有效的表示(错误:无法解析日期   “10:00:00”:与任何标准表格不兼容   (“yyyy-MM-dd'T'HH:mm:ss.SSSZ”,“yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”,“EEE,   dd MMM yyyy HH:mm:ss zzz“,”yyyy-MM-dd“))

JSON REQUEST

 "timeSlot":{  
       "date":"2015-10-21",
       "endTime":"10:00:00",
       "startTime":"08:00:00",   
 }

修改

此问题类似于this,但是在反序列化时会出现这种情况。另一个解决方案有助于适当地序列化请求。

我已粘贴以下无效的示例代码 -

import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class TestJSONDeserialize {

    public static void main(String[] args){

        ObjectMapper mapper = new ObjectMapper();
        mapper.addMixIn(Data.class, MyMixin.class);

        String jsonString = "{\"date\":\"2014-02-10\",\"time\":\"16:15:00\"}";
        try {
            mapper.readValue(jsonString, Data.class);
        } catch (JsonParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


}

数据类(我无法对此文件进行更改)

import javax.xml.datatype.XMLGregorianCalendar;

public class Data {

    private XMLGregorianCalendar date;
    private XMLGregorianCalendar time;

    public XMLGregorianCalendar getDate() {
        return date;
    }
    public void setDate(XMLGregorianCalendar date) {
        this.date = date;
    }
    public XMLGregorianCalendar getTime() {
        return time;
    }
    public void setTime(XMLGregorianCalendar time) {
        this.time = time;
    }



}

运行时我看到以下错误:

  

com.fasterxml.jackson.databind.exc.InvalidFormatException:不能   从中构造javax.xml.datatype.XMLGregorianCalendar的实例   字符串值'16:15:00':不是有效表示(错误:失败   解析日期值'16:15:00':无法解析日期“16:15:00”:不是   兼容任何标准形式(“yyyy-MM-dd'T'HH:mm:ss.SSSZ”,   “yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”,“EEE,dd MMM yyyy HH:mm:ss zzz”,   “yyyy-MM-dd”))来源:{“date”:“2014-02-10”,“time”:“16:15:00”};   line:1,column:21](通过参考链:   com.comcast.json.test.Data [ “时间”])

3 个答案:

答案 0 :(得分:4)

here。在你的领域贴一个日期格式化程序:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="HH:mm:ss", timezone="CET")
private Date startTime;

答案 1 :(得分:0)

我能够使用自定义反序列化器和mixins完成此操作。代码 -

SELECT * from myTable WHERE myDATE BETWEEN LIKE 'datefrom%' AND LIKE 'dateend%'

答案 2 :(得分:0)

在这篇旧帖中已经回答了,但希望这对将来有所帮助。

DateFormat中指定ObjectMapper解决了我的问题。

objectMapper.setDateFormat(new SimpleDateFormat(MY_FORMAT));