Jackson和LocalDateTime:尾随零已被移除

4
我在Spring Boot项目中使用Jackson来生成JSON。在我的Java类中,我使用了private LocalDateTime timestamp;,而Jackson将其转换为JSON。当timestamp包含例如:2022-04-26T05:59:54:124530时,JSON对象会接收到2022-04-26T05:59:54:12453
这会导致我接收系统出现错误,因为它无法处理此日期格式。不幸的是,我无法更改接收系统。
有没有办法告诉Jackson不要删除末尾的零?

看看这个是否有帮助: https://dev59.com/9q_la4cB1Zd3GeqPy9MC 如果没有帮助,你可能需要使用自定义序列化器,使用@JsonGetter - Kaus2b
很遗憾,你的JSON字符串无论末尾是否带0都符合 ISO 8601标准,因此任何合理的接收系统都应该能够接收它。 - Ole V.V.
1
你是不是想说的是 "54.12453" 而不是 "54:12453"?(FULL STOP 和 COLON 的区别) - Basil Bourque
2个回答

0

LocaleDateTime类没有静态字符串格式。它包括一些选项:

  • uuuu-MM-dd'T'HH:mm
  • uuuu-MM-dd'T'HH:mm:ss
  • uuuu-MM-dd'T'HH:mm:ss.SSS
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSS
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSS

自定义序列化将帮助您实现静态输出。在下面的示例中,我使用了一个带有6毫秒位数的格式,就像您的情况一样。

@JsonDeserialize(using = BodyDeserializer.class)
@JsonSerialize(using = BodySerializer.class)
public class Body {

    public static final DATE_FORMAT = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss:SSSSSS");
    
    private LocalDateTime myDate;

    public Body(LocalDateTime myDate) {
        this.myDate = myDate;
    }

    public StrLocalDateTimeing getMyDate() { return myDate; }
}

public class BodyDeserializer extends JsonDeserializer {

    @Override
    public User deserialize(JsonParser jsonParser,
            DeserializationContext deserializationContext) throws IOException {
        ObjectCodec oc = jsonParser.getCodec();
        JsonNode node = oc.readTree(jsonParser);
        String date = node.get("myDate");
        LocalDateTime myDate = LocalDateTime.from(Body.DATE_FORMAT.parse(date))
        return new Body(myDate),
    }
}

public class BodySerializer extends JsonSerializer {

    @Override
    public void serialize(Body body, JsonGenerator jsonGenerator,
            SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeStartObject();
        
        jsonGenerator.writeNumberField("myDate", Body.DATE_FORMAT.format(body.getMyDate()));
        jsonGenerator.writeEndObject();
    }
}

0
你可以使用 @JsonFormat 来阻止去除尾部的零。
public class Transaction {

    import com.fasterxml.jackson.annotation.JsonFormat;
    //...

    @JsonFormat(
        shape = JsonFormat.Shape.STRING,
        pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS")
    public LocalDateTime dateTime;

}

我对上述代码的使用情况是用于JSON Kafka序列化器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接