0

我有一个类(不能修改),比如

public class Standing {

    private Integer positionNumber;
    private String positionText;
    private BigDecimal points;
    ..
}

反序列化时,我得到如下数据:

{
    "position": "1",
    "points": 10
}

由于我无法修改Standing课程,因此我有一个混合类,例如:

@JsonDeserialize(converter = StandingSanitizer.class)
public abstract class StandingMixIn {

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    Integer positionNumber;

    @JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)
    String positionText;
}

由于收到的 json 没有字段positionNumberpositionText因此我使用@JsonPropery注释。

Access.READ_ONLY只是忽略了这个positionNumber领域。

在字段@JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)上,positionText我确保它position在反序列化期间填充了来自 json 的字段。

这在反序列化期间效果很好。

注意StandingSanitizer集合positionNumber。这是因为接收到的position值可以是非数字值,DSQ在这种情况下,该positionNumber字段将为null.

但是在序列化时,我想从Standing类中输出所有 3 个字段,例如:

{
    "positionText": "1",
    "positionNumber": 1,
    "points": 10
}

但不幸的是,由于@JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)positionText现场它没有被序列化。

从理论上讲,我想做一些类似的事情:

@JsonDeserialize(converter = StandingSanitizer.class)
public abstract class StandingMixIn {

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    Integer positionNumber;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    @JsonProperty(value = "position", access = JsonProperty.Access.WRITE_ONLY)
    String positionText;
}

我可以@JsonProperty对 READ 和 WRITE 使用不同的注释。

但这是不可能的,因为@JsonProperty不允许在字段上重复注释;据我所知,不支持可重复的注释。

有没有其他解决方案来解决这个问题?

我能想到的一件事是有 2 个ObjectMapper实例,有 2 个不同的StandingMixIns;1 用于反序列化,1 用于序列化。但我宁愿继续拥有 1 个ObjectMapper实例,所以使用 2 将是最后的手段。

4

2 回答 2

1

谢谢@Franjavi,你确实是对的,我应该在 getter/setter 上使用注释,而不仅仅是在字段上。我只专注于使用字段,因为我的混合类是用 Groovy 编写的,带有隐式的 getter/setter。

我把班级精简了一点,只是:

    public abstract class StandingMixIn {

        @JsonProperty(access = JsonProperty.Access.READ_ONLY)
        Integer positionNumber;
        
        @JsonProperty(value = "positionText")
        public abstract String getPositionText();

        @JsonProperty(value = "position")
        public abstract void setPositionText(String positionText);
    }

(完全删除positionText并使用抽象方法)

于 2021-10-01T13:25:48.033 回答
0

您可以使用 getter 和 setter 来获得额外的自定义。get 将充当 READ,set 将充当 WRITE。请注意,您不需要访问属性或字段级别注释:

    public abstract class StandingMixIn {
        @JsonProperty(access = JsonProperty.Access.READ_ONLY)
        Integer positionNumber;
        
        // No annotation on the field
        String positionText;

        @JsonProperty(value = "positionText")
        public String getPositionText() {
            return positionText;
        }

        @JsonProperty(value = "position")
        public void setPositionText(String positionText) {
            this.positionText = positionText;
        }
    }
于 2021-10-01T10:15:37.900 回答