Kotlin:根据@JsonView更改json属性名称

时间:2018-12-07 21:58:42

标签: java serialization kotlin jackson deserialization

我正在尝试使用Jackson来以两种不同的方式序列化同一DTO对象,具体取决于<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.7.2/p5.min.js"></script>

我想在同一字段中使用2个不同的名称。在一种情况下,我想命名json属性@JsonView(就像类字段名一样),在另一种情况下,我希望将其命名为myField

因此,我希望看到类似于以下内容的结果:

用法1(外部API视图):

myInternalApiField

用法2(内部API视图):

{
    "myField": "value1",
    "myOtherField": "otherValue"
}

在实现Java的实现中,我使用了以下自定义getter,setter和{ "myInternalApiField": "value1", "myOtherField": "otherValue" } 批注的组合:

@JsonView

但是我不知道如何在Kotlin中正确地获得相同的结果。

我正在考虑使用类似的东西:

public class CustomDTO {
        @JsonView(Views.ExternalApiView)
        private String myField;
        // Other fields here

        @JsonView(Views.InternalApiView)
        public String getMyInternalApiField() { return myField; }
        @JsonView(Views.InternalApiView)
        public void setMyInternalApiField(String value) { this.myField = value; }

        @JsonView(Views.ExternalApiView)
        public String getMyField() { return myField; }

        @JsonView(Views.ExternalApiView)
        public void setMyField(String value) { this.myField = value }
}

但是Kotlin不允许这样做。

您是否有任何建议像我在Java中那样使用Kotlin中的data class CustomDTO( @get:[JsonView(Views.ExternalApiView) JsonProperty("myField")] @get:[JsonView(Views.InternalApiView) JsonProperty("myInternalApiField")] @set:[JsonView(Views.InternalApiView) JsonProperty("myField")] @set:[JsonView(Views.InternalApiView) JsonProperty("myInternalApiField")] var myField: String, val myOtherField: String, val myDifferentField: String )

1 个答案:

答案 0 :(得分:1)

怎么样?

data class CustomDTO(
        @JsonView(ExternalApiView::class)
        var myField: String,
        val myOtherField: String,
        val myDifferentField: String
) {
    val myExternalField: String
        @JsonView(InternalApiView::class)
        get() {
            return myField
        }
}

似乎有些方法不需要在DTO中创建计算的属性,例如:

但是这些都有自己的复杂性,即使DTO类中没有这种复杂性。我不确定这些对 me 是否更具吸引力,但您可以看到它们是否对您有吸引力。