如何正确序列化含字符串数组的JSON文件?Kotlin序列化报错解决
解决kotlinx.serialization解析数组JSON的类型不匹配问题
问题根源
你提供的JSON是直接的字符串数组(格式为["url1", "url2"]),但定义的ShibePhoto数据类要求解析一个包含photos字段的对象结构(JSON需以{开头)。解析器期望对象起始符{,实际却读到数组起始符[,因此抛出类型不匹配的解码异常。
两种解决办法
方法1:直接解析为List
不需要自定义数据类,直接将JSON解析成List<String>类型即可,完全适配当前的数组格式:
import kotlinx.serialization.Json import kotlinx.serialization.decodeFromString // 你的JSON字符串 val shibeJson = """["https://cdn.shibe.online/shibes/3f47b1c848763f156778015a20da91b5f365ea93.jpg","https://cdn.shibe.online/shibes/22ee83228be55bce16bc8c6e91790700229892b9.jpg"]""" // 直接解析为字符串列表 val photoUrls: List<String> = Json.decodeFromString(shibeJson)
方法2:调整JSON结构匹配数据类(若API可修改)
如果能控制返回的JSON格式,将其修改为包含photos字段的对象结构,就能继续使用你定义的ShibePhoto类:
修改后的JSON示例:
{ "photos": [ "https://cdn.shibe.online/shibes/3f47b1c848763f156778015a20da91b5f365ea93.jpg", "https://cdn.shibe.online/shibes/22ee83228be55bce16bc8c6e91790700229892b9.jpg" ] }
此时原ShibePhoto类的解析代码可以正常运行:
val photos: ShibePhoto = Json.decodeFromString(shibeJson)
总结
如果无法修改JSON格式,优先选择方法1,这是最直接适配现有数据结构的方案。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

