首页 > 解决方案 > 如何将相同但具有不同值的 JSON 对象反序列化为 java 类

问题描述

我有以下情况:

有时我得到这个JSON 对象

{"id": 1, "cp": "male", "money": 10.0, "startDate": "07:00", "endDate": "10:00"}

和其他人这个

{"id":1, "cp": "male", "money": 10.0, "startDate": 21600, "endDate": 32400}

如您所见,JSON 具有相同的字段,但有时startDateendDate在第二种情况下以秒为单位的格式不同。

你有简单的java类

public class Person {

    private Integer id;

    private String cp;

    private Double money;

    @JsonDeserialize(converter = StringToLocalTimeConverter.class)
    private LocalTime startDate;

    @JsonDeserialize(converter = StringToLocalTimeConverter.class)
    private LocalTime startDate;

    //Getter-Setter

转换器

public class StringToLocalTimeConverter extends StdConverter<String, LocalTime> {

    static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ISO_LOCAL_TIME;

    @Override
    public LocalTime convert(String value) {


        Long number = Long.parseLong(value);

        return LocalTime.MIN.plusSeconds(number);

    }

}

显然,我遇到了解析异常,因为由于格式的原因,我无法将两个数据值映射到同一个 LocalTime 中。

是否可以将两个JSON 对象映射到同一个类?我该如何解决这个问题,或者我必须创建单独的类可以应用哪些解决方案。

标签: jsonspring-bootjacksondeserialization

解决方案


好吧,您可以DateTimeFormatter.ISO_LOCAL_TIME先尝试解析它。如果失败,则将其解析为 long :

public class StringToLocalTimeConverter extends StdConverter<String, LocalTime> {

    static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ISO_LOCAL_TIME;

    @Override
    public LocalTime convert(String value) {
        try {
            return LocalTime.parse(value, DATE_FORMATTER);
        } catch (DateTimeParseException e) {}

        Long number = Long.parseLong(value);
        return LocalTime.MIN.plusSeconds(number);
    }

}

推荐阅读