Kotlin JSON解析报错,请求排查响应模型或JSON响应问题
JSON解析错误排查与解决
问题概述
遇到JSON解析错误:Unexpected Error : Unexpected character encountered while parsing value: }. Path 'resultData.data', line 1, position 184,无法确定是Kotlin响应数据模型问题还是后端JSON格式错误,谷歌搜索未找到适配Kotlin的解决方案,请求协助排查。
相关信息
后端返回的响应JSON片段
"data":{ "productInfo":{ "data":{ "toBarcode":"2704439285463", "productJson":{ "p_no":"28420000", "p_name":"ASA" } } }, "moves":{ "data":[{ "fisAcik":"MALVERENDEN", "toBarcode":"2704439285463", "toJson":{ "to_Hks_Adi":"DAĞITIM MERKEZİ" }, "movementJson":{ "isleme_Tarihi":"21/12/2022 02:19:30" } } ] } }
Kotlin数据模型(Data.kt)
data class Data( val productInfo: ProductInfo, val moves: Moves ) data class Moves ( val data: List<MovesItem> ) data class MovesItem ( @SerializedName("fisAcik") val receiptExplanation: String, val toBarcode: String, val toJson: ToJson, val movementJson: MovementJson ) data class MovementJson ( @SerializedName("isleme_Tarihi") val processDate: String ) data class ToJson ( @SerializedName("to_Hks_Adi") val toUnitHksName: String ) data class ProductInfo ( val data: ProductInfoItems ) data class ProductInfoItems ( val toBarcode: String, val productJson: ProductJson ) data class ProductJson ( @SerializedName("p_No") val migrosProductNo: String, @SerializedName("p_Name") val migrosProductName: String )
请求方法
suspend fun dataGetInfo(@Body request: DataRequest): NetworkResult<BaseResponse<Data>>
排查与解决步骤
1. 分析JSON格式问题
错误提示提到Path 'resultData.data',说明解析器期望响应外层包含resultData字段,但你提供的JSON片段只有"data":{...},缺少完整的外层包裹。此外,当前片段本身也不是合法的JSON(合法JSON必须以{开头、}结尾),大概率是后端返回的完整响应存在语法错误(比如多余的}、缺失逗号或外层结构不完整)。
解决建议:
- 抓包获取完整的后端响应JSON,用JSON校验工具验证合法性;
- 确认响应是否包含
resultData外层结构,正确的完整结构应该类似:{ "resultData": { "data": { // 你的data内容 } } }
2. 修正数据模型字段映射
ProductJson类的注解与后端字段不匹配:后端返回的是全小写的p_no和p_name,但模型中用了@SerializedName("p_No")和@SerializedName("p_Name")(首字母大写),这会导致字段映射失败,触发解析错误。
修改后的ProductJson类:
data class ProductJson ( @SerializedName("p_no") val migrosProductNo: String, @SerializedName("p_name") val migrosProductName: String )
3. 可选:添加空值容错处理
如果后端可能返回空字段或缺失字段,建议给模型字段添加?标记为可空类型,避免因字段缺失导致解析失败,示例:
data class MovesItem ( @SerializedName("fisAcik") val receiptExplanation: String?, val toBarcode: String?, val toJson: ToJson?, val movementJson: MovementJson? )
内容的提问来源于stack exchange,提问作者Ahmet Yılmaz
相关产品推荐
相关产品推荐

