我在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(...
鉴于数据对象的类定义无论数据类型变量如何都不会改变,使用带有"repaymentDetails"
注释的RepaymentDetails
类型的单个@JsonAlias("ssdRepaymentDetails", "loanRepaymentDetails")
Json属性足以将两个可能的有效载荷反序列化为单个不可为空的字段。
当OP突出显示时,可能需要附加的@JsonProperty("repaymentDetails")
。
我认为,最好的做法是使用sealed class
(为简洁起见删除了注释):