java JSON Jackson ObjectMapper ReadValue - 转换日期时出错
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33113375/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JSON Hymanson ObjectMapper ReadValue - Error in converting date
提问by Punter Vicky
I am seeing the error listed below when trying to convert the json string to an object. I don't have the source code for Data class & it is part of a jar file. Is there a way I could use mixins to get this fixed?
尝试将 json 字符串转换为对象时,我看到下面列出的错误。我没有 Data 类的源代码,它是 jar 文件的一部分。有没有办法可以使用混合来解决这个问题?
CODE
代码
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(request, Data.class);
ERROR
错误
org.codehaus.Hymanson.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"))
org.codehaus.Hymanson.map.JsonMappingException:无法从字符串值“10:00:00”构造 javax.xml.datatype.XMLGregorianCalendar 的实例:不是有效的表示(错误:无法解析日期“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
JSON 请求
"timeSlot":{
"date":"2015-10-21",
"endTime":"10:00:00",
"startTime":"08:00:00",
}
EDIT
编辑
This issue is similar to this, however this is occuring while deserializing. The other solution helped in appropriately serializing the request.
此问题与此类似,但是这是在反序列化时发生的。另一个解决方案有助于适当地序列化请求。
I have pasted the sample code which is not working below -
我已经粘贴了下面不起作用的示例代码 -
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.Hymanson.core.JsonParseException;
import com.fasterxml.Hymanson.core.JsonProcessingException;
import com.fasterxml.Hymanson.databind.JsonMappingException;
import com.fasterxml.Hymanson.databind.ObjectMapper;
import com.fasterxml.Hymanson.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();
}
}
}
Data class (I cannot make changes to this file)
数据类(我无法更改此文件)
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;
}
}
I see the below error when I run this :
当我运行这个时,我看到以下错误:
com.fasterxml.Hymanson.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"])
com.fasterxml.Hymanson.databind.exc.InvalidFormatException:无法从字符串值“16:15:00”构造 javax.xml.datatype.XMLGregorianCalendar 的实例:不是有效的表示(错误:无法解析日期值“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","时间":"16:15:00"}; 行:1,列:21](通过参考链:com.comcast.json.test.Data["time"])
采纳答案by Punter Vicky
I was able to get this done using custom deserializer and mixins. Code Below -
我能够使用自定义解串器和 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.Hymanson.core.JsonParseException;
import com.fasterxml.Hymanson.core.JsonProcessingException;
import com.fasterxml.Hymanson.databind.JsonMappingException;
import com.fasterxml.Hymanson.databind.ObjectMapper;
import com.fasterxml.Hymanson.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.Hymanson.core.JsonParser;
import com.fasterxml.Hymanson.core.JsonProcessingException;
import com.fasterxml.Hymanson.databind.DeserializationContext;
import com.fasterxml.Hymanson.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.Hymanson.core.JsonParser;
import com.fasterxml.Hymanson.core.JsonProcessingException;
import com.fasterxml.Hymanson.databind.DeserializationContext;
import com.fasterxml.Hymanson.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.Hymanson.annotation.JsonFormat;
import com.fasterxml.Hymanson.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);
}
回答by sh0rug0ru
回答by RahulArackal
Already answered in this old post, but hope this will be helpful for someone in future.
已经在这个旧帖子中回答了,但希望这对将来的人有所帮助。
Specifying DateFormat
in ObjectMapper
solved my issue.
指定DateFormat
在ObjectMapper
解决了我的问题。
objectMapper.setDateFormat(new SimpleDateFormat(MY_FORMAT));