Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 使用贴图操作符kotlin将对象列表转换为另一个对象?_List_Kotlin - Fatal编程技术网

List 使用贴图操作符kotlin将对象列表转换为另一个对象?

List 使用贴图操作符kotlin将对象列表转换为另一个对象?,list,kotlin,List,Kotlin,我有以下JSON数据 [ { "type": "carousal", "items": [ { "type": "story", "data": { "display_name": "grinning 1" } }, { "type": "story&q

我有以下JSON数据

[
{
"type": "carousal",
"items": [
  {
    "type": "story",
    "data": {
      "display_name": "grinning 1"
    }
  },
  {
    "type": "story",
    "data": {
      "display_name": "grinning 2"
    }
  }
]
},
{
"type": "carousal",
"items": [
  {
    "type": "story",
    "data": {
      "display_name": "grinning 3"
    }
  },
  {
    "type": "story",
    "data": {
      "display_name": "grinning 4"
    }
  }
]
}
]
相应的数据类是

data class ServerResponse(
@SerializedName("type")
val type: String,
@SerializedName("items")
val subTypes: List<ServerResponse>,
@SerializedName("data")
val data: Data)

data class Data(
@SerializedName("display_name")
val displayName: String)
这就是我使用map操作符寻找的那种响应,它返回一个list-convertedData对象

[
  {
    "type": "story",
    "display_name": "grinning 1"
  },
  {
    "type": "story",
    "display_name": "grinning 2"
  },
  {
    "type": "story",
    "display_name": "grinning 3"
  },
  {
    "type": "story",
    "display_name": "grinning 4"
  }
]
我创建了一个扩展来将数据转换为

fun ServerResponse.toConvertedData(): ConvertedData? {
val data: ConvertedData? = null
if(type.equals("carousal")){
    // compare subtypes type to "story" and put it converted data object
}
return data
}
注释部分我无法理解,因为我需要进入
items
数组,并希望按如下方式使用它

val convertedData= serverResponse.map { it.toConvertedData() }

嘿,您使用的逻辑不正确,map对您的用例没有用处,因为map用于将每个项转换为目标项。同样在您的例子中,json是ServerResonse类的列表。 使用下面的扩展功能,希望这能解决您的问题

fun List<ServerResponse>.toConvertedData(): List<ConvertedData> {
    val convertedData:ArrayList<ConvertedData> = ArrayList()
    this.forEach {  data->
        if(data.type == "carousal"){
            data.subTypes.forEach { subData->
                if(subData.type == "story"){
                    convertedData.add(ConvertedData(subData.type,subData.data.displayName))
                }

            }
        }

    }
    return convertedData
}
fun List.toConvertedData():List{
val convertedData:ArrayList=ArrayList()
this.forEach{data->
如果(data.type==“carousal”){
data.subtype.forEach{subData->
if(subData.type==“故事”){
添加(convertedData(subData.type,subData.data.displayName))
}
}
}
}
返回转换数据
}

您应该有以下课程

data class ConvertedData(val type: String, val name: String)

data class ServerResponse(val type: String, val items: List<Grining>)

data class Grining(val type:String, val data:Data)

data class Data(val display_name: String)

data class Response(val response: List<ServerResponse>)
数据类转换数据(val类型:String,val名称:String)
数据类ServerResponse(val类型:字符串,val项:列表)
数据类研磨(val类型:字符串,val数据:数据)
数据类数据(val显示\名称:字符串)
数据类响应(val响应:列表)
然后尝试此函数将其转换为所需的json格式

fun Response.toConvertedData(): List<ConvertedData> {
val outputList: MutableList<ConvertedData> = mutableListOf()
this.response.forEach {  serverResponse ->
    if(serverResponse.type == "carousal"){
        // compare subtypes type to "story" and put it converted data object
            serverResponse.items.forEach {
                outputList.add(ConvertedData(it.type, it.data.display_name))
            }
        }
    }

    return outputList
}
fun Response.toConvertedData():列表{
val outputList:MutableList=mutableListOf()
this.response.forEach{serverResponse->
if(serverResponse.type==“carousal”){
//将子类型类型与“故事”进行比较,并将其放在转换后的数据对象中
serverResponse.items.forEach{
add(ConvertedData(it.type、it.data.display_name))
}
}
}
返回输出列表
}

映射通常在每个源项转换为一个目标项时使用。
如果源列表中的每个项目都可以在目标列表中生成多个项目,则应改用
flatMap

在您的情况下,单个
ServerResponse
实例可以映射到多个
ConvertedData
实例:

fun ServerResponse.convertsublities():列表=
亚型
.filter{it.type==“故事”}
.map{ConvertedData(type=it.type,name=it.data.displayName)}
然后您可以将其与
flatMap
一起使用:

val serverResponseList=TODO(“从某处获取服务器响应列表”)
val result=serverResponseList.filter{it.type==“carousal”}
.flatMap{it.convertsublites()}

如果您能够正确地重新插入代码段,那就太好了。您是否检查了文档中的映射函数?据我了解,这种逻辑是不正确的。您将读取
ServerResponse
列表,并返回带有
ConvertedData
项的映射列表。或者,您可以通过在外部迭代一个接一个地执行此操作。但地图功能将帮助您做到这一点。看起来JSON的初始数据模型并不正确,除非JSON的结构比它看起来更灵活。您似乎正在尝试将单个
ServerResponse
转换为单个
ConvertedData
实例。如果要获得所需的输出,需要从
ServerResponse
获取
ConvertedData
列表。另外,如果您只选择带有
“story”
子类型的,为什么需要在
ConvertedData
中存储
类型
fun Response.toConvertedData(): List<ConvertedData> {
val outputList: MutableList<ConvertedData> = mutableListOf()
this.response.forEach {  serverResponse ->
    if(serverResponse.type == "carousal"){
        // compare subtypes type to "story" and put it converted data object
            serverResponse.items.forEach {
                outputList.add(ConvertedData(it.type, it.data.display_name))
            }
        }
    }

    return outputList
}