Kotlin中如何将toString生成的People列表字符串转回List<People>
把自定义toString()生成的字符串转回List
这确实是个常见的小困扰——毕竟toString()的输出本来就不是为了序列化/反序列化设计的,不过咱们可以手动解析这个格式固定的字符串,一步步把它转成List<People>。
首先假设你的People数据类是这样的:
data class People(val name: String, val age: Int)
接下来直接上可行的解析代码,我会一步步解释每个环节:
val peopleString = "[People(name=john, age=23), People(name=mary, age=21), People(name=george, age=11)]" val peopleList: List<People> = peopleString // 第一步:去掉字符串首尾的方括号,得到中间的条目集合字符串 .removeSurrounding("[", "]") // 第二步:把每个People条目拆分出来,拆分符是"), People(",刚好匹配条目之间的分隔格式 .split("), People(") // 第三步:遍历每个条目,解析成People对象 .map { rawEntry -> // 清理每个条目的前后缀:第一个条目开头是"People(",最后一个条目结尾是")",统一处理掉 val cleanedEntry = rawEntry.removePrefix("People(").removeSuffix(")") // 拆分name和age的键值对,按", "分割(注意这里的空格要和原字符串格式一致) val (nameSegment, ageSegment) = cleanedEntry.split(", ") // 提取name的值:去掉"name="前缀 val name = nameSegment.removePrefix("name=") // 提取age的值并转成Int:去掉"age="前缀后转整数 val age = ageSegment.removePrefix("age=").toInt() // 生成People对象 People(name, age) }
一些注意事项:
- 这个方案完全依赖你给出的
toString()输出格式,如果格式有变化(比如name=后面加了引号、逗号和age之间没有空格),需要对应调整拆分和清理的规则。 - 如果你的
People类有更多字段,只需要在map环节里添加对应的字段解析逻辑就行。 - 要是担心格式不稳定,下次建议用标准的序列化方式(比如Gson、Jackson)来保存列表,而不是用
toString(),这样反序列化会更可靠。
内容的提问来源于stack exchange,提问作者Rgfvfk Iff
相关产品推荐
相关产品推荐

