【问题标题】:Json mapper converts LocalDate to month, year, day of month etcJson 映射器将 LocalDate 转换为月、年、月日等
【发布时间】:2018-08-01 19:43:42
【问题描述】:

Json 映射器将LocalDate 转换为月、年、月中的某一天...当像这样将 java 类转换为 json 时,

"dob":{
  "year": 1992,
  "month": "MARCH",
  "dayOfMonth": 19,
  "dayOfWeek": "THURSDAY",
  "era": "CE",
  "dayOfYear": 79,
  "leapYear": true,
  "monthValue": 3,
  "chronology": {
    "calendarType": "iso8601",
    "id": "ISO"
  }
}

这在mysql中保存为Date1992-03-19如何返回这个日期,就像它一样

"dob:1992-03-19"

【问题讨论】:

  • 只是好奇,如何使用 Jackson 对象映射器将 LocalDate 序列化为带有一堆字段的对象?

标签: json spring-mvc jackson-databind localdate


【解决方案1】:

杰克逊和java.time 类型

Jackson JavaTimeModule 用于处理java.time 的序列化和反序列化。

它为java.time 类型提供了一组serializersdeserializers。如果SerializationFeature.WRITE_DATES_AS_TIMESTAMPS禁用java.time 类型将以标准ISO-8601 字符串表示形式进行序列化。

以您的特定格式处理序列化

然而,一旦你有了一个非常特殊的格式,你就可以创建一个自定义的序列化器:

public class DateOfBirthSerializer extends JsonSerializer<LocalDate> {

    @Override
    public void serialize(LocalDate value, JsonGenerator gen,
                          SerializerProvider serializers) throws IOException {
        gen.writeString("dob:" + value.format(DateTimeFormatter.ISO_DATE));
    }
}

那么你可以如下使用它:

public class Foo {

    @JsonSerialize(using = DateOfBirthSerializer.class)
    private LocalDate dateOfBirth;

    // Getters and setters
}

您也可以使用:

SimpleModule module = new SimpleModule();
module.addSerializer(LocalDate.class, new DateOfBirthSerializer());

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);

它将应用于使用该ObjectMapper 序列化的所有LocalDate 实例。

以您的特定格式处理反序列化

对于反序列化,您可以使用类似:

public class DateOfBirthDeserializer extends JsonDeserializer<LocalDate> {

    @Override
    public LocalDate deserialize(JsonParser p,
                                 DeserializationContext ctxt) throws IOException {

        String value = p.getValueAsString();
        if (value.startsWith("dob:")) {
            value = value.substring(4);
        } else {
            throw ctxt.weirdStringException(value, 
                    LocalDate.class, "Value doesn't start with \"dob:\"");
        }

        return LocalDate.parse(value, DateTimeFormatter.ISO_DATE);
    }
}

【讨论】:

  • 如何调用或注册这个或者我应该把这个代码放在哪里以便映射器可以使用这个?
  • 还有那个注释提示,太简单了,我们大多数人更喜欢那个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2015-04-29
  • 1970-01-01
  • 2013-07-30
  • 2020-01-11
  • 1970-01-01
相关资源
最近更新 更多