为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用Jackson JSON处理器序列化Joda DateTime?

如何使用Jackson JSON处理器序列化Joda DateTime?

犯罪嫌疑人X 2019-12-16 11:23:21
如何使用Jackson JSON处理器序列化Joda DateTime?如何让Jackson根据简单的模式(例如“ dd-MM-yyyy”)序列化我的Joda DateTime对象?我试过了:@JsonSerialize(using=DateTimeSerializer.class)private final DateTime date;我也尝试过:ObjectMapper mapper = new ObjectMapper()    .getSerializationConfig()    .setDateFormat(df);谢谢!
查看完整描述

4 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

对于Jackson 2,使用默认格式非常容易;只需JodaModule在您的帐户上注册即可ObjectMapper。


ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new JodaModule());

对于的自定义序列化/反序列化DateTime,您需要实现自己的StdScalarSerializer和StdScalarDeserializer;它非常令人费解,但是无论如何。


例如,这是一个在UTC时区DateTime使用的序列化器ISODateFormat:


public class DateTimeSerializer extends StdScalarSerializer<DateTime> {


    public DateTimeSerializer() {

        super(DateTime.class);

    }


    @Override

    public void serialize(DateTime dateTime,

                          JsonGenerator jsonGenerator,

                          SerializerProvider provider) throws IOException, JsonGenerationException {

        String dateTimeAsString = ISODateTimeFormat.withZoneUTC().print(dateTime);

        jsonGenerator.writeString(dateTimeAsString);

    }

}

以及相应的反序列化器:


public class DateTimeDesrializer extends StdScalarDeserializer<DateTime> {


    public DateTimeDesrializer() {

        super(DateTime.class);

    }


    @Override

    public DateTime deserialize(JsonParser jsonParser,

                                DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        try {

            JsonToken currentToken = jsonParser.getCurrentToken();

            if (currentToken == JsonToken.VALUE_STRING) {

                String dateTimeAsString = jsonParser.getText().trim();

                return ISODateTimeFormat.withZoneUTC().parseDateTime(dateTimeAsString);

            }

        } finally {

            throw deserializationContext.mappingException(getValueClass());

        }

    }

然后将它们与模块捆绑在一起:


public class DateTimeModule extends SimpleModule {


    public DateTimeModule() {

        super();

        addSerializer(DateTime.class, new DateTimeSerializer());

        addDeserializer(DateTime.class, new DateTimeDeserializer());

    }

}

然后在您的上注册该模块ObjectMapper:


ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new DateTimeModule());


查看完整回答
反对 回复 2019-12-16
  • 4 回答
  • 0 关注
  • 818 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信