2015-10-13 38 views
1

嘗試將json字符串轉換爲對象時,我看到下面列出的錯誤。我沒有Data類的源代碼&它是jar文件的一部分。有沒有一種方法可以使用mixin來修復這個問題?JSON Jackson ObjectMapper ReadValue - 轉換日期時出錯

CODE

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

ERROR

org.codehaus.jackson.map.JsonMappingException: Can not construct instance of javax.xml.datatype.XMLGregorianCalendar from String value '10:00:00': not a valid representation (error: Can not parse date "10:00:00": not compatible with any of standard forms ("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: Can not construct instance of javax.xml.datatype.XMLGregorianCalendar from String value '16:15:00': not a valid representation (error: Failed to parse Date value '16:15:00': Can not parse date "16:15:00": not compatible with any of standard forms ("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")) at [Source: {"date":"2014-02-10","time":"16:15:00"}; line: 1, column: 21] (through reference chain: com.comcast.json.test.Data["time"])

回答

0

我能夠使用自定義解串器和mixin完成此操作。下面的代碼 -

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, NewMixin.class); 

     String jsonString = "{\"date\":\"2014-02-10\",\"time\":\"16:15:00\"}"; 
     Data data = null; 
     try { 
      data = 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(); 
     } 

     if(data != null){ 
      System.out.println(" Data " + data.getDate()); 
      System.out.println(" Data " + data.getTime()); 
     } 
    } 


} 



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

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

import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.DeserializationContext; 
import com.fasterxml.jackson.databind.JsonDeserializer; 

public class CustomDateDeserializer extends JsonDeserializer<XMLGregorianCalendar> { 

    private static SimpleDateFormat formatter = 
     new SimpleDateFormat("yyyy-MM-dd"); 


    @Override 
    public XMLGregorianCalendar deserialize(JsonParser jsonparser, DeserializationContext arg1) throws IOException, JsonProcessingException { 
     // TODO Auto-generated method stub 
     String date = jsonparser.getText(); 
     try { 

      GregorianCalendar c = new GregorianCalendar(); 
      c.setTime(formatter.parse(date)); 
      XMLGregorianCalendar date2 = null; 
      try { 
       date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); 
      } catch (DatatypeConfigurationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return date2; 
     } catch (ParseException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 




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

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

import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.DeserializationContext; 
import com.fasterxml.jackson.databind.JsonDeserializer; 

public class CustomTimeDeserializer extends JsonDeserializer<XMLGregorianCalendar> { 

    private static SimpleDateFormat formatter = 
     new SimpleDateFormat("hh:mm:ss"); 


    @Override 
    public XMLGregorianCalendar deserialize(JsonParser jsonparser, DeserializationContext arg1) throws IOException, JsonProcessingException { 
     // TODO Auto-generated method stub 
     String date = jsonparser.getText(); 
     try { 

      GregorianCalendar c = new GregorianCalendar(); 
      c.setTime(formatter.parse(date)); 
      XMLGregorianCalendar date2 = null; 
      try { 
       date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); 
      } catch (DatatypeConfigurationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return date2; 
     } catch (ParseException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 



import javax.xml.datatype.XMLGregorianCalendar; 

import com.fasterxml.jackson.annotation.JsonFormat; 
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 

abstract class NewMixin { 

    @JsonDeserialize(using = CustomDateDeserializer.class) 
    public abstract void setDate(XMLGregorianCalendar date); 

    @JsonDeserialize(using = CustomTimeDeserializer.class) 
    public abstract void setTime(XMLGregorianCalendar time); 
} 
3

here。將日期格式化程序粘貼到您的字段上:

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

謝謝。我沒有Java文件,但是我使用的是一個由不同團隊提供的jar的一部分。我將無法修改包含此字段的類。我也不能爲整個班級設置一個通用的日期時間格式,因爲日期是yyyy-MM-dd,時間是hh:mm:ss –

0

已經在這篇舊文章中回答,但希望這將有助於未來的人。

指定DateFormatObjectMapper解決了我的問題。

objectMapper.setDateFormat(new SimpleDateFormat(MY_FORMAT)); 
相關問題