Kotlin中使用Retrofit解析JSON动态键的问题排查与解决
解决Retrofit+Gson解析含动态键JSON时values字段为空的问题
问题场景
JSON结构中values字段下是以动态字符串为键的数据对象,最初定义了如下数据类:
data class ApiResponse(val status: Int, val values: WorkflowsTest?) data class WorkflowsTest(val values: Map<String, Id>?) data class Id(val id: String)
配置Retrofit使用GsonConverterFactory发起请求后,返回的ApiResponse中values始终为空(日志显示values=WorkflowsTest(values=null),请求状态status=1表示成功),但在main函数中直接用Gson解析相同JSON字符串却能正常获取数据。
问题原因
当JSON节点对应的是动态键的对象时,用固定字段的自定义数据类(如WorkflowsTest)接收会导致解析失败:Gson无法将动态变化的键名匹配到数据类的固定字段上,无法完成映射,最终导致values字段为空。
解决方法
将ApiResponse的values字段类型直接改为Map<String, Id>?,让Gson自动将动态键的对象转换为键值对集合:
data class ApiResponse( val status: Int, val values: Map<String, Id>? // 替换原WorkflowsTest?类型 ) data class Id(val id: String)
修改后,Retrofit即可正确解析values字段下的动态键数据。
内容的提问来源于stack exchange,提问作者Yepson
相关产品推荐
相关产品推荐

