Kotlin 如何将DataModel类映射到DomainModel类?
我正在创建DataModel和DomainModel类,以避免代码中的空检查。 如何映射嵌套类? 我可以给出什么默认值 MyDataModel.kt(没有太多关于API的信息,所以我需要假设所有值都可以为null)Kotlin 如何将DataModel类映射到DomainModel类?,kotlin,Kotlin,我正在创建DataModel和DomainModel类,以避免代码中的空检查。 如何映射嵌套类? 我可以给出什么默认值 MyDataModel.kt(没有太多关于API的信息,所以我需要假设所有值都可以为null) 数据类MyDataModel( @序列化名称(“id”) val id:Int?, @SerializedName(“显示时间”) val timeToShow:Int?, @序列化名称(“作者”) 作者:作者?, @序列化名称(“问题”) 问:问题?, @序列化名称(“答案”) 答
数据类MyDataModel(
@序列化名称(“id”)
val id:Int?,
@SerializedName(“显示时间”)
val timeToShow:Int?,
@序列化名称(“作者”)
作者:作者?,
@序列化名称(“问题”)
问:问题?,
@序列化名称(“答案”)
答案:列表?
) {
数据类作者(
@SerializedName(“名字”)
val firstName:字符串?,
@SerializedName(“姓氏”)
val lastName:字符串?,
@序列化名称(“图像”)
val图像:字符串?
)
数据类问题(
@序列化名称(“id”)
val id:长?,
@序列化名称(“标题”)
val标题:字符串?
)
数据类答案(
@序列化名称(“id”)
val id:长?,
@序列化名称(“标题”)
val标题:字符串?,
@序列化名称(“图像”)
val answerImage:answerImage?
) {
数据类应答器映像(
@序列化名称(“0”)
val x0:回答ImageData?
) {
数据类应答ImageData(
@序列化名称(“id”)
val id:字符串?,
@序列化名称(“url”)
val url:String?
)
}
}
}
MyDomainModel.kt(稍后我将需要创建一个函数来检查此类上的所有属性是否有效)
数据类MyDomainModel(
val id:Int,
val timeToShow:Int,
作者:作者,
问题:问题,,
val答案:列表
) {
数据类作者(
val firstName:String,
val lastName:String,
val图像:字符串
)
数据类问题(
val id:Long,
val标题:字符串
)
数据类答案(
val id:Long,
val标题:字符串,
val-imageUrl:String?
)
}
映射器类
interface Mapper<F,S> {
fun dataToDomainModel(dataModel: F): S
fun domainToDataModel(domainModel: S): F
}
class DataToDomainMapper: Mapper<MyDataModel, MyDomainModel> {
override fun dataToDomainModel(first: MyDataModel): MyDomainModel {
return MyDomainModel(
id = first.id ?: -1,
title = first.title ?: "",
question = ??????
)
}
override fun domainToDataModel(second: MyDomainModel): MyDataModel {
return MyDataModel(
id = second.id,
title = second.title,
...
)
}
}
接口映射器{
有趣的dataToDomainModel(dataModel:F):S
趣味领域模型(领域模型:S):F
}
类DataToDomainMapper:Mapper{
覆盖有趣的dataToDomainModel(第一个:MyDataModel):MyDomainModel{
返回MyDomainModel(
id=first.id?:-1,
title=first.title?:“”,
问题=??????
)
}
覆盖有趣的域模型(第二个:MyDomainModel):MyDataModel{
返回MyDataModel(
id=second.id,
title=second.title,
...
)
}
}
您不需要嵌套类。推出课程:
data class MyDataModel(
@SerializedName("id")
val id: Int?,
@SerializedName("time_to_show")
val timeToShow: Int?,
@SerializedName("author")
val author: Author?,
@SerializedName("question")
val question: Question?,
@SerializedName("answers")
val answers: List<Answer>?
)
data class Author(
@SerializedName("first_name")
val firstName: String?,
@SerializedName("last_name")
val lastName: String?,
@SerializedName("image")
val image: String?
)
data class Question(
@SerializedName("id")
val id: Long?,
@SerializedName("title")
val title: String?
)
data class Answer(
@SerializedName("id")
val id: Long?,
@SerializedName("title")
val title: String?,
@SerializedName("image")
val answerImage: AnswerImage?
)
data class AnswerImage(
@SerializedName("0")
val x0: AnswerImageData?
)
data class AnswerImageData(
@SerializedName("id")
val id: String?,
@SerializedName("url")
val url: String?
)
数据类MyDataModel(
@序列化名称(“id”)
val id:Int?,
@SerializedName(“显示时间”)
val timeToShow:Int?,
@序列化名称(“作者”)
作者:作者?,
@序列化名称(“问题”)
问:问题?,
@序列化名称(“答案”)
答案:列表?
)
数据类作者(
@SerializedName(“名字”)
val firstName:字符串?,
@SerializedName(“姓氏”)
val lastName:字符串?,
@序列化名称(“图像”)
val图像:字符串?
)
数据类问题(
@序列化名称(“id”)
val id:长?,
@序列化名称(“标题”)
val标题:字符串?
)
数据类答案(
@序列化名称(“id”)
val id:长?,
@序列化名称(“标题”)
val标题:字符串?,
@序列化名称(“图像”)
val answerImage:answerImage?
)
数据类应答器映像(
@序列化名称(“0”)
val x0:回答ImageData?
)
数据类应答ImageData(
@序列化名称(“id”)
val id:字符串?,
@序列化名称(“url”)
val url:String?
)
然后,您需要为这些类中的每一个都有一个域模型,并为每个类实现一个映射器。然后使用所需的映射器映射较大类的属性(我所说的较大类是指具有另一个类作为属性的类)
您的最终代码应该如下所示(构造函数中有更多映射器):
类DataToDomainMapper(val问题映射器:问题映射器):映射器{
覆盖有趣的dataToDomainModel(第一个:MyDataModel):MyDomainModel{
返回MyDomainModel(
id=first.id?:-1,
title=first.title?:“”,
question=questionMapper.firstToSecond(first.question)
)
}
覆盖有趣的域模型(第二个:MyDomainModel):MyDataModel{
返回MyDataModel(
id=second.id,
title=second.title,
...
)
}
}
您需要在QuestionMapper
interface Mapper<F,S> {
fun dataToDomainModel(dataModel: F): S
fun domainToDataModel(domainModel: S): F
}
class DataToDomainMapper: Mapper<MyDataModel, MyDomainModel> {
override fun dataToDomainModel(first: MyDataModel): MyDomainModel {
return MyDomainModel(
id = first.id ?: -1,
title = first.title ?: "",
question = ??????
)
}
override fun domainToDataModel(second: MyDomainModel): MyDataModel {
return MyDataModel(
id = second.id,
title = second.title,
...
)
}
}
data class MyDataModel(
@SerializedName("id")
val id: Int?,
@SerializedName("time_to_show")
val timeToShow: Int?,
@SerializedName("author")
val author: Author?,
@SerializedName("question")
val question: Question?,
@SerializedName("answers")
val answers: List<Answer>?
)
data class Author(
@SerializedName("first_name")
val firstName: String?,
@SerializedName("last_name")
val lastName: String?,
@SerializedName("image")
val image: String?
)
data class Question(
@SerializedName("id")
val id: Long?,
@SerializedName("title")
val title: String?
)
data class Answer(
@SerializedName("id")
val id: Long?,
@SerializedName("title")
val title: String?,
@SerializedName("image")
val answerImage: AnswerImage?
)
data class AnswerImage(
@SerializedName("0")
val x0: AnswerImageData?
)
data class AnswerImageData(
@SerializedName("id")
val id: String?,
@SerializedName("url")
val url: String?
)
class DataToDomainMapper(val questionMapper: QuestionMapper): Mapper<MyDataModel, MyDomainModel> {
override fun dataToDomainModel(first: MyDataModel): MyDomainModel {
return MyDomainModel(
id = first.id ?: -1,
title = first.title ?: "",
question = questionMapper.firstToSecond(first.question)
)
}
override fun domainToDataModel(second: MyDomainModel): MyDataModel {
return MyDataModel(
id = second.id,
title = second.title,
...
)
}
}