如何使JsonGenerator漂亮的日期和日期时间值?

rip*_*234 7 java datetime json jackson

我正在使用此方法将任何对象转换为json字符串:

private String objectToJson(Object object) throws IOException {
        // write JSON
        StringWriter writer = new StringWriter();
        ObjectMapper mapper = new ObjectMapper();
        final JsonGenerator jsonGenerator = mapper.getJsonFactory().createJsonGenerator(writer);
        jsonGenerator.setPrettyPrinter(new DefaultPrettyPrinter());

        mapper.writeValue(jsonGenerator, object);
        return writer.toString();
    }
Run Code Online (Sandbox Code Playgroud)

当正在打印的对象包含java.util.Date或jodatime的DateTime字段时,打印值是自纪元以来的毫秒数.相反,我希望用标准的"HH:MM:SS"符号来打印它们.我应该怎么做呢?

Sta*_*Man 8

在FAQ的第一个答案中已经提到过这个问题,但是以下情况:您可以选择数字和文本表示(默认使用数字,因为它更快),使用此功能:

objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
Run Code Online (Sandbox Code Playgroud)

执行此操作将使用默认日期格式,然后您可以按照提到的方式重新定义(使用setDateFormat).

另外:您可以像这样简化代码:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
return mapper.writeValueAsString(object);
Run Code Online (Sandbox Code Playgroud)

而不是显式使用StringWriter和JsonGenerator.


小智 7

因为纪元时间戳(1970年1月1日以来的毫秒数,UTC)是最有效和准确的时间表示,所以几乎所有与日期和时间相关的对象都被序列化.您当然可以覆盖它,如果您想使用问题中提到的格式,则需要在代码中添加以下内容:

DateFormat myDateFormat = new SimpleDateFormat("hh:mm:ss");
objectMapper.getSerializationConfig().setDateFormat(myDateFormat);
objectMapper.getDeserializationConfig().setDateFormat(myDateFormat); 
Run Code Online (Sandbox Code Playgroud)

有关Jackson JSON处理器中日期和时间的更多信息,请参阅以下链接:http://wiki.fasterxml.com/JacksonFAQDateHandling

  • 新形式(因为setDateFormat标记为``deprecated``实际上是``getDeserializationConfig().withDateFormat(...)``now (2认同)