Serializing Joda DateTime object is creating different output depending on context

谁说胖子不能爱 提交于 2021-01-27 21:09:28

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!