如何定义数据类(JSON / Kotlin)中可能不存在变量?

问题描述 投票:0回答:2

我在Kotlin中有一个数据类和一个对象:

A 数据类 Tranche.kt

@JsonIgnoreProperties(ignoreUnknown = true)
data class Tranche(
        @JsonProperty("id") var id: String,
        @JsonProperty("status") var status: String,
        @JsonProperty("instrumentType") var instrumentType: String,
        @JsonProperty("ssdRepaymentDetails") var ssdRepaymentDetails: RepaymentDetails?,
        @JsonProperty("loanRepaymentDetails") var loanRepaymentDetails: RepaymentDetails?
) : PayloadContent

DummyTransaction.kt中的对象”>

val trancheDummy = Tranche(id = "0", name = "dummy", status = "DRAFT", instrumentType = "Loan", ssdRepaymentDetails = repaymentDetailsDummy, loanRepaymentDetails = repaymentDetailsDummy)

将RepaymentDetails设置为可为空,我允许ssdDetails和loanDetails为null。一切都很好,但是我既不需要ssdDetails也不需要loanDetails。如果instrumentType是SSD,我需要ssdDetails,而InstrumentType是Loan时,则需要loanDetails。

我如何做到这一点,而又不为不同的产品保留两个数据类?意思是,我希望有以下两个对象:

val trancheDummySsd = Tranche(id = "0", name = "dummy", status = "DRAFT", instrumentType = "SSD", ssdRepaymentDetails = repaymentDetailsDummy)
val trancheDummyLoan = Tranche(id = "0", name = "dummy", status = "DRAFT", instrumentType = "Loan", loanRepaymentDetails = repaymentDetailsDummy)

需求的事实是,SSD和Loan的JSON字符串是不同的,而在后端,在读取它时,我只需要该字符串中的一个属性(payCycle),并且这两个产品都具有该属性。] >

RepaymentDetails.kt

@JsonIgnoreProperties(ignoreUnknown = true)
data class RepaymentDetails(
        @JsonProperty("payCycle") var payCycle: String?
)

这部分是用Go语言编写的,它定义了JSON结构:

type RepaymentDetails struct {
    PayCycle string `json:"payCycle,omitempty"` 
}

type LoanRepaymentDetails struct {
    RepaymentDetails // inherits RepaymentDetails struct 
}

type SsdRepaymentDetails struct {
    RepaymentDetails // inherits RepaymentDetails struct 
    LastPaymentDate string `json:"lastPaymentDate,omitempty"`
}

[我在Kotlin中有一个数据类和一个对象:一个数据类Tranche.kt @JsonIgnoreProperties(ignoreUnknown = true)数据类Tranche(@JsonProperty(“ id”)var id:String,@JsonProperty(...

json kotlin nullable
2个回答
2
投票

鉴于数据对象的类定义无论数据类型变量如何都不会改变,使用带有"repaymentDetails"注释的RepaymentDetails类型的单个@JsonAlias("ssdRepaymentDetails", "loanRepaymentDetails") Json属性足以将两个可能的有效载荷反序列化为单个不可为空的字段。

当OP突出显示时,可能需要附加的@JsonProperty("repaymentDetails")


0
投票

我认为,最好的做法是使用sealed class(为简洁起见删除了注释):

© www.soinside.com 2019 - 2024. All rights reserved.