杰克逊@JsonDeserialize不在现场工作

问题描述

@JsonDeserialize在字段上不起作用。

使用Spring Boot 2。

代码

@Data
public class EventOddPOJO {

    @JsonProperty("id")
    private String id;

    @JsonDeserialize(using = EventOddPartDeserializer.class)
    private String part;

    @JsonProperty("ss")
    private String score;

    @JsonDeserialize(using = EventOddMinuteDeserializer.class)
    private String minute;

    @JsonDeserialize(using = EventOddSecondDeserializer.class)
    private String second;

    @JsonProperty("over_od")
    private String overOd;

    @JsonProperty("home_od")
    private String homeOd;

    @JsonProperty("draw_od")
    private String drawOd;

    @JsonProperty("away_od")
    private String awayOd;

    @JsonProperty("under_od")
    private String underOd;

    @JsonProperty("time_str")
    private String timeStr;

    @JsonProperty("add_time")
    private String addTime;

    @JsonProperty("handicap")
    private String handicap;

    public static class EventOddPartDeserializer extends StdDeserializer < String > {

        public EventOddPartDeserializer() {
            this(null);
        }

        public EventOddPartDeserializer(Class < ? > vc) {
            super(vc);
        }

        @Override
        public String deserialize(JsonParser p,DeserializationContext ctxt) throws IOException,JsonProcessingException {

            String timeStr = p.getValueAsstring("timeStr");

            if (Objects.isNull(timeStr)) {
                return "-";
            }

            return timeStr.split(" - ")[0];

        }
    }

    public static class EventOddMinuteDeserializer extends StdDeserializer < String > {

        public EventOddMinuteDeserializer() {
            this(null);
        }

        public EventOddMinuteDeserializer(Class < ? > vc) {
            super(vc);
        }

        @Override
        public String deserialize(JsonParser p,JsonProcessingException {

            String timeStr = p.getValueAsstring("timeStr");

            if (Objects.isNull(timeStr)) {
                return "-";
            }

            return timeStr.split(" - ")[1].split(":")[0];

        }
    }

    public static class EventOddSecondDeserializer extends StdDeserializer < String > {

        public EventOddSecondDeserializer() {
            this(null);
        }

        public EventOddSecondDeserializer(Class < ? > vc) {
            super(vc);
        }

        @Override
        public String deserialize(JsonParser p,JsonProcessingException {

            String timeStr = p.getValueAsstring("timeStr");

            if (Objects.isNull(timeStr)) {
                return "-";
            }

            return timeStr.split(" - ")[1].split(":")[1];

        }
    }

}

Json:

{
                    "id": "35008186","home_od": "1.952","handicap": "+3.5","away_od": "1.740","ss": "95:98","time_str": "4 - 04:08","add_time": "1603807890"
}

解决方法

对于interface list { one: string two: string } const myNumber = "one" 有效负载中的相同值,您不能同时使用3个不同的反序列器。如果您需要将值解析为3个不同的属性,则可以创建新的JSON并在自定义反序列化器中实现解析。

POJO-s:

POJO

自定义反序列化器:

@Data
class EventOddPOJO {

    @JsonProperty("id")
    private String id;

    @JsonProperty("ss")
    private String score;

    @JsonProperty("over_od")
    private String overOd;

    @JsonProperty("home_od")
    private String homeOd;

    @JsonProperty("draw_od")
    private String drawOd;

    @JsonProperty("away_od")
    private String awayOd;

    @JsonProperty("under_od")
    private String underOd;

    @JsonDeserialize(using = EventOddPartDeserializer.class)
    @JsonProperty("time_str")
    private EventOddPart timeStr;

    @JsonProperty("add_time")
    private String addTime;

    @JsonProperty("handicap")
    private String handicap;
}

@Data
class EventOddPart {
    private String part;
    private String minute;
    private String second;
}