通过 Jackson 将 LocalDateTime 字段转换为 JSON 字符串会导致逗号分隔的日期字段?

Converting LocalDateTime field to JSON String via Jackson results in comma separated date field?

我有一个具有以下结构的 JSON 对象:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Record {
private String tid;
private String eid;

@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime ts;

public Record() {
}
}

当我尝试使用以下方法将其转换为字符串时,

public static String convertToJSON(Object object) {
        ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
        String json;
        try {
            json = ow.writeValueAsString(object);
            LOGGER.info("(convertToJSON) JSON: {}", json);
        } catch (Exception e) {
            throw new JSONException("Error Converting JSON To string", e);
        }
        return json;
    }

我得到一个逗号分隔值如下: "ts" : [ 2021, 4, 4, 20, 17, 50, 522000000 ]

我希望将其打印为 ISO-UTC "ts" : "2021-04-04 20:46:44:932" 或 "ts" : "2021-04-04 20:46:44:932z".

一个是将 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss:SSS") 添加到记录对象,但我不希望不更改 Json 对象定义,因为这会对生产中的飞行数据产生影响。 有没有办法改变我的 convertToJSON 方法来实现这个。

有很多关于此的 Stackoverlfow 帖子。很简单,请试试:

public class MyTest {
    @Data
    public static class Foo {
        private LocalDateTime date;
    }

    public static void main(String[] args) throws JsonProcessingException {
        Foo foo = new Foo();
        foo.setDate(LocalDateTime.now());
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        System.out.println(objectMapper.writeValueAsString(foo));
    }
}

结果将是:{"date":"2021-04-05T11:19:38.999185"}。请注意,我使用来自 Lombok 的 @Data 来简化。 对于 JavaTimeModule,您可能需要添加 Maven 依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.12.2</version>
</dependency>