当前位置: 首页 > 知识库问答 >
问题:

如何使用Jackson解析LocalDate

唐默
2023-03-14

我在通过邮递员传递json数据时遇到问题。如果Mandetory日期带有@NotNull注释,没问题。另一个日期接受null。但是在更新时,该日期会产生问题。我使用Java1.8与Spring启动

以下链接我已经访问过,但不适合这个。杰克逊JSON解析错误的LocalDateTime解析:无法构造java.time.LocalDate的实例:没有String参数构造函数/工厂方法从String值反序列化https://stackoverflow.com/a/29959842/3415090JSONJavaSpring Boot中的8 LocalDateTime格式

我也用过

@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)

但是问题仍然存在。

我的用户体验

public class LeaveApplUx {

    @JsonIgnore
    @Size(max = 5, message = "Employee Code Must Be Within 4 To 5 Character Long Or Blank")
    private final String employeeCode;

    @NotNull(message = "Start Date Empty")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    private final LocalDate startDate;

    @JsonIgnore
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    private final LocalDate rejoinDate;

    public LeaveApplUx(
            @Size(min = 4, max = 5, message = "Employee Code Must Be Within 4 To 5 Character Long Or Blank") 
        @JsonProperty("employeeCode") String employeeCode,
            @NotNull(message = "Start Date Empty") @JsonProperty("startDate") LocalDate startDate,
            @JsonProperty("rejoinDate") LocalDate rejoinDate) {
        this.employeeCode = employeeCode;
        this.startDate = startDate;
        this.rejoinDate = rejoinDate;
    }
//  GETTERS
}

在创作时,它工作得很好。

{
    "employeeCode": "B426",
    "startDate": "01-03-2023"
}

输入参数:{“员工代码”:“B426”、“开始日期”:{“年份”:2023、“月份”:“三月”、“月值”:3、“日月”:1、“跨年”:假、“日周”:“周三”、“日年”:60、“时代”:“CE”、“年表”:{“id”:“ISO”、“calendarType”:“iso8601”}}、“rejoinDate”:null}记录在DB中正确保存

但是在更新时,它会产生错误。

{
    "employeeCode": "B426",
    "startDate": "01-03-2023",
    "rejoinDate": "06-03-2023"
}

JSON parse error: 

Cannot deserialize value of type `java.time.LocalDate` from String "06-03-2023": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '06-03-2023' could not be parsed at index 0; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDate` from String "06-03-2023": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '06-03-2023' could not be parsed at index 0
     at [Source: (PushbackInputStream); line: 14, column: 19] (through reference chain: org.myapp.ux.hr.leave.LeaveApplUx["rejoinDate"])

共有1个答案

孔俊捷
2023-03-14

由于您通过构造函数而不是setter设置值,因此您应该将@JsonFormat(...)放在构造函数参数上,而不是字段上。这应该可以解决它:

public class LeaveApplUx {

    @JsonIgnore
    private final String employeeCode;

    private final LocalDate startDate;

    @JsonIgnore
    private final LocalDate rejoinDate;

    public LeaveApplUx(@JsonProperty("employeeCode") String employeeCode,
                       @JsonProperty("startDate") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy") LocalDate startDate,
                       @JsonProperty("rejoinDate") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy") LocalDate rejoinDate) {
        this.employeeCode = employeeCode;
        this.startDate = startDate;
        this.rejoinDate = rejoinDate;
    }

    //getters
}
 类似资料:
  • 我在MongoDB集合中有以下文档,我希望将该文档映射回Kotlin对象。 我编写了一个自定义的反序列化器来读取UUID的二进制值,但它失败了。如有任何帮助,我们将不胜感激。 主应用程序。 序列化程序和反序列化程序:

  • 谁能帮我找出我在这里做错了什么。我必须解析下面的XML字符串 为此,我有三个bean要映射,如下所示 我试图像下面这样解析 我使用的是jackson-dataformat-xml版本2.9.8。

  • 我正在尝试将旧的EJB服务(其中的逻辑)包装在一个微服务中。我使用Quarkus/RESTEasy实现此微服务 但是,我在自定义序列化/反序列化时遇到问题。 问题:,这让我相信Jackson并不认为Geometry是要解析为String的类。这让我相信对象映射器没有被拾取。。 注1:我可以在Quarkus日志中提供的日志语句中看到: 注2:单元测试在上运行良好。 这是我要解析的JSON(注:几何是

  • 问题内容: 我从REST服务返回以下JSON响应。现在,我需要将以下JSON响应反序列化为POJO。我正在与杰克逊合作。 在上面的json中,是一个可以具有多个json对象的JSON数组。现在也是JSON数组。现在棘手的部分是,我可以在每个类别对象中拥有多个级别,并且我不知道我将拥有多少个级别。给定以上JSON,我需要提取每个类别和last的内容。所以应该是这样的: 其中是类别的taskId,是l

  • 问题内容: 我具有以下值: 和以下类: 我想将其解析为a 或a 使用Jackson的 方法最简单? 问题答案: 我终于明白了: