问题
I have an object in which is nested a Joda DateTime object, and I'm having trouble serializing it and deserializing it.
When I serialize the full object that DateTime is nested in, the output looks vastly different than when I serialize the DateTime object directly, my results are below
new ObjectMapper.writeValueAsString(fullObjectWithDateTime) produces the following blob for the DateTime object:
{
"dateTime": {
"weekOfWeekyear": 34,
"weekyear": 2019,
"yearOfEra": 2019,
"yearOfCentury": 19,
"centuryOfEra": 20,
"secondOfDay": 4530,
"minuteOfDay": 75,
"millisOfDay": 4530777,
"monthOfYear": 8,
"hourOfDay": 1,
"minuteOfHour": 15,
"secondOfMinute": 30,
"millisOfSecond": 777,
"year": 2019,
"dayOfMonth": 21,
"dayOfWeek": 3,
"era": 1,
"dayOfYear": 233,
"millis": 1566350130777,
"chronology": {
"zone": {
"fixed": true,
"id": "UTC"
}
},
"zone": {
"fixed": true,
"id": "UTC"
},
"afterNow": false,
"beforeNow": true,
"equalNow": false
}
}
ObjectMapper.writeValueAsString(fullObjectWithDateTime.getDateTime())
produces:
"2019-08-21T01:15:30.777Z"
The error comes when I try to deserialize the object produced by ObjectMapper.writeValueAsString(fullObjectWithDateTime), where it says
'com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of org.joda.time.DateTime out of START_OBJECT token'
回答1:
You need to register JodaModule.
Example:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.joda.JodaModule;
import org.joda.time.DateTime;
public class JsonApp {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.registerModule(new JodaModule());
String json = mapper.writeValueAsString(new MyModel());
System.out.println(json);
MyModel model = mapper.readValue(json, MyModel.class);
System.out.println(model);
}
}
class MyModel {
private DateTime now = DateTime.now();
public DateTime getNow() {
return now;
}
public void setNow(DateTime now) {
this.now = now;
}
@Override
public String toString() {
return "MyModel{" +
"now=" + now +
'}';
}
}
Above code prints:
{"now":"2019-09-06T21:58:34.917Z"}
MyModel{now=2019-09-06T21:58:34.917Z}
来源:https://stackoverflow.com/questions/57824754/serializing-joda-datetime-object-is-creating-different-output-depending-on-conte