如何为此网络服务创建kotlin数据类?

问题描述

在这种JSON服务中,我想知道在这种情况下您将采取什么方法来制作数据类

我在其他服务字段下有 subCategories 。 subCategories中的每个项目都有一个 slug 字段,该字段也是其他数据元素(例如- digital-currency 图片 打印 。现在,我的要求是我想根据用户对subCategories项目的选择来选择适当的数据类。如果用户选择了以下项目

 {
    "title": "電子マネー","slug": "digital-currency"
 }

然后我应该能够匹配 slug 字段,然后选择数字货币数据元素

    "digital-currency": {
    "slug": "digital-currency","title": "電子マネー","_id": "7j6OzPKVzim7xvW8BvI8zV","isSub": true,"parent": "other-services"
  }

如何为此设置数据类?

解决方法

您可以通过以下方式简化代码。

data class NetworkResponse(
    val otherServices: OtherServices,val digitalCurrency: SubCategory,val picture: SubCategory,val print: SubCategory
) {
    fun getUserSelectedCategory(slug : String) : SubCategory? {
       return when (slug) {
            "digital-currency" -> digitalCurrency
            "picture" -> picture
            "print" -> print
            else -> null
        }
    }
}

data class OtherServices(val subCategory: List<SubCategory>)
data class SubCategory(val title: String,val slug: String)

,

下面是我的解决方案,如果我正确理解它,那就是在异构列表中找到给定类型的对象。此处 DigitalCurrency 图片 打印 宠物用品 ,等等,都是异构类型。要选择此项中的任何一项,请使用 slug 字段作为标识符,您必须具有映射机制才能为具有给定json结构的给定类型选择正确的数据对象。

但是,每次在后端添加新的数据元素时,我的解决方案都会添加WHEN条件。我相信,根据此处的要求和Json结构,这不能泛化为可以扩展到适当数据类的任何扩展,而无需将来对Code进行任何其他更改。

如果您认为Data类可以以不需要修改代码即可容纳新添加的数据的方式构造,请告诉我。

data class NetworkResponse(
    val otherServices: OtherServices,val digitalCurrency: DigitalCurrency,val picture: Picture,val print: Print
) {
    
    fun getUserSelectedCategory(slug : String) : BaseClass {
        when (slug) {
            "digital-currency" -> {
                return digitalCurrency
            }

            "picture" -> {
                return picture
            }

            "print" -> {
                return print
            }
        }
    }
    

}


data class OtherServices(val subCategory: List<SubCategory>) {
}

interface BaseClass
data class SubCategory(val title: String,val slug: String) : BaseClass
data class DigitalCurrency(val title: String,val slug: String) : BaseClass
data class Picture(val title: String,val slug: String) : BaseClass
data class Print(val title: String,val slug: String) : BaseClass