使用Retrofit与Gson解析含未知数字key的JSON字符串报错如何解决
错误原因
- 你定义的
NamesListNWEntity中list字段类型多嵌套了一层结构:根据你提供的JSON,list下的数字key对应的value直接就是NameNW结构的对象,没有额外的字符串key层,你写的Map<Int, Map<String, NameNW>>会让Gson尝试解析第二层Map,实际遇到的是NameNW对象,就会抛出类型不匹配的错误。 - 补充说明:JSON对象的key本质都是字符串类型,Gson默认支持自动将字符串格式的数字key转换为Int类型的Map键,不需要额外配置。
解决方案
第一步:修正实体类定义
直接修改NamesListNWEntity的list字段类型即可,修改后代码如下:
data class NamesListNWEntity( val action: String, val list: Map<Int, NameNW>, // 去掉多余的Map嵌套 val status: String )
修改完成后即可正常解析返回的JSON结构,list的key就是对应的数字值,value就是对应的NameNW实例,不需要修改服务端代码。
第二步(可选):将数字key存入NameNW实例
如果需要把数字key也整合到实体类中,可以在拿到解析结果后手动转换:
// 解析拿到NamesListNWEntity后做转换 val nameList = namesListNWEntity.list.map { (id, nameNW) -> NameWithId( id = id, nickname = nameNW.nickname, fullname = nameNW.fullname ) } // 对应业务实体类定义示例 data class NameWithId( val id: Int, val fullname: String, val nickname: String )
内容的提问来源于stack exchange,提问作者maganthro
相关产品推荐
相关产品推荐

