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