【问题标题】:How can the polymorphic with internal property type can be handled in Kotlin?在 Kotlin 中如何处理具有内部属性类型的多态?
【发布时间】:2021-02-05 15:48:06
【问题描述】:

早安,弗里曼先生!我正在尝试为外部 api 的 Json / Object 转换制作一个非平凡的多态 dto。 dto 包含属性,可以是两种类型,但这取决于它的内部值......假设我有一个这样的 json:

[{
    "Id": 1,
    "Age": 2,
    "Car": {
        "MaxPassengers": 20,
        "Model": "Audi",
        "UniqueAudyTechnology": true
    },
    "Vendor": "VOLKSWAGEN AUTO GROUP (VAG)"
},
{
    "Id": 2,
    "Age": 1,
    "Car": {
        "MaxPassengers": 5,
        "Model": "Skoda",
        "SkodaRentalProgramId": 100
    },
    "Vendor": "VOLKSWAGEN AUTO GROUP (VAG)"
}]

所以,在“汽车”字段中,我可以有任何汽车类,但要定义它,我需要使用 Car.Model 属性。 我做了一个通用的接口和数据类:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.EXISTING_PROPERTY,
    property = "Model",
    visible = true
)
@JsonSubTypes(value = [
    JsonSubTypes.Type(value = Audi::class, name = "Audi"),
    JsonSubTypes.Type(value = Skoda::class, name = "Skoda")
])
@ApiModel(description = "Used car")
interface UsedCar {
    @get:JsonProperty("Id")
    val id: Long

    @get:JsonProperty("Age")
    val age: Int

    @get:JsonProperty("Vendor")
    val vendor: String
}

和数据类:

data class Audi(

    @JsonProperty("UniqueAudyTechnology")
    val hasUniqueAudyTechnology: boolean,

    @JsonProperty("Model")
    val model: String,

    @JsonProperty("MaxPassengers")
    val maxPassengers: Int
)

data class Skoda(

    @JsonProperty("SkodaRentalProgramId")
    val skodaRentalProgramId: Int,

    @JsonProperty("Model")
    val model: String,

    @JsonProperty("MaxPassengers")
    val maxPassengers: Int
)

事实上,我想让杰克逊通过子类型属性模型解析子类型。我整天都在尝试,但我无法理解我错过了什么......? 附言代码可能不起作用,因为我已经删除了奥迪和斯柯达对 UsedCar 的实现......对不起......不知道如何处理......

【问题讨论】:

    标签: json kotlin jackson


    【解决方案1】:

    恕我直言,对于发送多个未使用字段的 API,这是最简单的解决方案。

    @JsonIgnoreProperties(ignoreUnknown = true)
    data class Car(
            @JsonProperty("Id")
            val id: Long,
    
            @JsonProperty("Age")
            val age: Int,
    
            @JsonProperty("Vendor")
            val vendor: String,
    
            @JsonProperty("UniqueAudiTechnology")
            val hasUniqueAudiTechnology: Boolean,
    
            @JsonProperty("SkodaRentalProgramId")
            val skodaRentalProgramId: Int,
    
            @JsonProperty("Model")
            val model: String,
    
            @JsonProperty("MaxPassengers")
            val maxPassengers: Int)
    

    如果有很多字段,它会变得非常乏味,但首先这是一个糟糕的 API 设计。

    通过上述方式查看this答案以获取更多信息。

    【讨论】:

    • 这不是我需要的解决方案。关键是我需要组织一些接口和数据类的层次结构,或者可能只是数据类,可以由 className 定义......
    猜你喜欢
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多