Java joda.time.DateTime反序列化错误
我尝试反序列化日期时间为attibute的类:Java joda.time.DateTime反序列化错误,java,json,datetime,serialization,deserialization,Java,Json,Datetime,Serialization,Deserialization,我尝试反序列化日期时间为attibute的类: import org.joda.time.DateTime; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserial
import org.joda.time.DateTime;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer;
import com.fasterxml.jackson.datatype.joda.ser.DateTimeSerializer;
class MyClass {
private DateTime alertTimestamp;
private String name;
@JsonSerialize(using = DateTimeSerializer.class)
public DateTime getAlertTimestamp() {
return alertTimestamp;
}
@JsonDeserialize(using = DateTimeDeserializer.class)
public void setAlertTimestamp(DateTime now) {
this.alertTimestamp = now;
}
//...
}
但当我尝试tro反序列化时,我有一个例外:
com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer has no default (no arg) constructor
我使用它来反序列化:
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(jsonData, MyClass.class);
我的jsonData的一个例子:
{
"name":"test",
"alertTimestamp": {"year":2014,"era":1,"dayOfMonth":24,"dayOfWeek":1,"dayOfYear":83,"weekOfWeekyear":13,"weekyear":2014,"monthOfYear":3,"yearOfEra":2014,"yearOfCentury":14,"centuryOfEra":20,"millisOfSecond":232,"millisOfDay":45143232,"secondOfMinute":23,"secondOfDay":45143,"minuteOfHour":32,"minuteOfDay":752,"hourOfDay":12,"zone":{"uncachedZone":{"cachable":true,"fixed":false,"id":"America/Los_Angeles"},"fixed":false,"id":"America/Los_Angeles"},"millis":1395689543232,"chronology":{"zone":{"uncachedZone":{"cachable":true,"fixed":false,"id":"America/Los_Angeles"},"fixed":false,"id":"America/Los_Angeles"}},"afterNow":false,"beforeNow":false,"equalNow":true}
}
@JsonDeserialize
需要一个带有无参数构造函数的JsonDeserializer
。最新版本的DateTimeDeserializer
没有这样的构造函数
如果您已经固定了格式,即alertTimestamp
应该只是一个时间戳,那么您可以简单地使用ObjectMapper
注册JodaModule
。它将在内部为DateTime
字段使用DateTimeDeserializer
。您可以去掉@jsondesialize
注释
mapper.registerModule(new JodaModule());
您需要添加
jackson数据类型joda
库。您能否澄清timestamp
vsalertTimestamp
?很抱歉,这是一个错误,是什么JSON生成器在jsonData
中生成了JSONDateTimeSerializer
未序列化为该格式。根据类DateTimeDeserializer
具有公共无参数构造函数。这就产生了一个问题:您是否有正确的导入或适当的jar版本?@MenoHochschild您能提供一个示例吗?@arcone您想要一个什么示例?我想出来了-这是DateTime的Spring响应问题。我在GlassFish中遇到了一个bug,它拒绝我注册JodaModule
:-(是否有其他方法应用反序列化方法?@thomas.mc.work您需要为DateTime
字段注册自定义反序列化程序。