【问题标题】:custom and different json date format自定义和不同的 json 日期格式
【发布时间】:2017-06-08 00:41:16
【问题描述】:

我已经找到了如何自定义ObjectMapper 日期格式以让 Spring 帮助自动序列化/反序列化(当我想将对象返回给客户端时进行序列化,当请求正文是 json 对象时进行反序列化),但我有许多具有不同日期格式的 DTO,有些可能需要 yyyy-mm-dd,有些是 dd-mm-yyyy,一个 ObjectMapper 不适用于不同所需的日期格式,此问题的最佳实践解决方案是什么?

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    super.configureMessageConverters(converters);
    converters.add(mappingJacksonHttpMessageConverter());
}

MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter() {
    MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter = new MappingJacksonHttpMessageConverter();
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setDateFormat(new SimpleDateFormat("dd-MM-yyyy"));
    objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
    mappingJacksonHttpMessageConverter.setObjectMapper(objectMapper);
    mappingJacksonHttpMessageConverter.setPrettyPrint(true);
    return mappingJacksonHttpMessageConverter;
}

【问题讨论】:

  • 您是否有不同的 pojo 映射到 DTO 或使用相同的 POJO 映射不同的 DTO?
  • Erm... 在控制器中,我只使用 DTO,我的 POJO 是数据库实体。我不知道你说的“地图”是什么意思?
  • 我在谈论映射在 DTO 存储库层中的 pojos
  • 是的,我的POJO实体很少,因为我的表单数据或返回的数据与POJO实体不一样,所以我创建了很多与POJO几乎相同但有些可能不一样的DTO , 并且 DTO 包含一些验证逻辑。
  • @harshavmb 是的,我试过了,注解确实比全局ObjectMapper配置优先级更高。

标签: java json


【解决方案1】:

您可以使用自定义序列化器并在单个序列化器中处理不同的格式。以下是一些关于如何创建自定义序列化器/反序列化器的信息的页面:

Create Custom Serializer

Create Custom Deserializer

-- 编辑--

来自 MappingJacksonHttpMessageConverter 的 documentation(添加了一些重点):

setObjectMapper
公共无效 setObjectMapper(org.codehaus.jackson.map.ObjectMapper objectMapper)

    为此视图设置 ObjectMapper。如果未设置,则使用默认 ObjectMapper。

    设置自定义配置的 ObjectMapper 是进一步控制的一种方法
    JSON序列化过程。例如,扩展的 SerializerFactory
    可以配置为为特定类型提供自定义序列化程序。
    改进序列化过程的另一个选择是使用 Jackson 的
    为要序列化的类型提供注释,在这种情况下 a
    不需要自定义配置的 ObjectMapper。

这意味着如果您有由注释定义的序列化器/反序列化器(如我上面发布的链接中所述),您甚至不需要调用setObjectMapper。为了您的利益,这里有一个例子:

用于序列化

创建一个 StdSerializer 对象来处理你感兴趣的类型

public class ItemSerializer extends StdSerializer<Item> {
    // ...

    @Override
    public void serialize(Item value, JsonGenerator jgen, SerializerProvider provider) {
        // Write the Item data into the JsonGenerator
    }
}

通过注解为对象定义序列化器

@JsonSerialize(using = ItemSerializer.class)
public class Item {
    // ...
}

用于反序列化

创建一个 StdDeserializer 对象来处理你感兴趣的类型

public class ItemDeserializer extends StdDeserializer<Item> { 
    // ... 

    @Override
    public Item deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException {
        // Handle the different date formats here!

        return new Item(/*parsed date object*/);
    }
}

通过注解为对象定义反序列化器

@JsonDeserialize(using = ItemDeserializer.class)
public class Item {
    // ...
}

【讨论】:

    猜你喜欢
    • 2016-11-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多