序列化 Joda DateTime 对象根据上下文创建不同的输出

Serializing Joda DateTime object is creating different output depending on context

我有一个对象,其中嵌套了一个 Joda DateTime 对象,但我在对其进行序列化和反序列化时遇到了问题。

当我序列化嵌套 DateTime 的完整对象时,输出看起来与我直接序列化 DateTime 对象时大不相同,我的结果如下

new ObjectMapper.writeValueAsString(fullObjectWithDateTime) 为 DateTime 对象生成以下 blob:

{
    "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())

产生:

"2019-08-21T01:15:30.777Z"

当我尝试反序列化由 ObjectMapper.writeValueAsString(fullObjectWithDateTime) 生成的对象时出现错误,其中显示

'com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of org.joda.time.DateTime out of START_OBJECT token'

您需要注册JodaModule

示例:

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 +
                '}';
    }
}

以上代码打印:

{"now":"2019-09-06T21:58:34.917Z"}
MyModel{now=2019-09-06T21:58:34.917Z}