9

我正在使用此方法将任何对象转换为 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();
    }

当正在打印的对象包含 java.util.Date 或 jodatime 的 DateTime 字段时,打印的值是自纪元以来的毫秒数。相反,我想以标准的“HH:MM:SS”表示法漂亮地打印它们。我该怎么做呢?

4

2 回答 2

8

这已经在常见问题解答第一个答案点中提到,但以防万一:您可以通过使用此功能在数字和文本表示(默认使用数字,因为它更快)之间进行选择:

objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);

这样做将使用默认日期格式,然后您可以按照上述方式重新定义(使用 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);

而不是显式使用 StringWriter 和 JsonGenerator。

于 2010-12-19T18:50:55.813 回答
7

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

DateFormat myDateFormat = new SimpleDateFormat("hh:mm:ss");
objectMapper.getSerializationConfig().setDateFormat(myDateFormat);
objectMapper.getDeserializationConfig().setDateFormat(myDateFormat); 

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

于 2010-12-14T21:43:15.513 回答