JSON Jackson ObjectMapper ReadValue - 转换日期时出错
JSON Jackson ObjectMapper ReadValue - Error in converting date
我在尝试将 json 字符串转换为对象时看到下面列出的错误。我没有 Data class 的源代码,它是 jar 文件的一部分。有什么方法可以使用 mixins 来解决这个问题吗?
代码
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(request, Data.class);
错误
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 请求
"timeSlot":{
"date":"2015-10-21",
"endTime":"10:00:00",
"startTime":"08:00:00",
}
编辑
此问题与 类似,但这是在反序列化时发生的。另一个解决方案有助于适当地序列化请求。
我已经在下方粘贴了无法正常工作的示例代码 -
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();
}
}
}
数据class(我无法更改此文件)
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"])
参见here。在您的字段上贴上日期格式器:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="HH:mm:ss", timezone="CET")
private Date startTime;
我能够使用自定义反序列化器和混入来完成这项工作。下面的代码 -
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);
}
已在旧 post 中回答,但希望这对以后的人有所帮助。
在 ObjectMapper
中指定 DateFormat
解决了我的问题。
objectMapper.setDateFormat(new SimpleDateFormat(MY_FORMAT));
我在尝试将 json 字符串转换为对象时看到下面列出的错误。我没有 Data class 的源代码,它是 jar 文件的一部分。有什么方法可以使用 mixins 来解决这个问题吗?
代码
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(request, Data.class);
错误
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 请求
"timeSlot":{
"date":"2015-10-21",
"endTime":"10:00:00",
"startTime":"08:00:00",
}
编辑
此问题与
我已经在下方粘贴了无法正常工作的示例代码 -
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();
}
}
}
数据class(我无法更改此文件)
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"])
参见here。在您的字段上贴上日期格式器:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="HH:mm:ss", timezone="CET")
private Date startTime;
我能够使用自定义反序列化器和混入来完成这项工作。下面的代码 -
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);
}
已在旧 post 中回答,但希望这对以后的人有所帮助。
在 ObjectMapper
中指定 DateFormat
解决了我的问题。
objectMapper.setDateFormat(new SimpleDateFormat(MY_FORMAT));