Android中Retrofit+Moshi传递含@的JSON键名丢失问题求助
解决Retrofit+Moshi传递带@特殊字符键名的问题
你当前用@Json(name = "@Keyname")的写法本身是合规的,出现键被移除的情况大概率是配置环节出了问题,试试下面这些排查和解决步骤:
确认Moshi实例配置正确
Kotlin项目中,创建Moshi实例时必须添加KotlinJsonAdapterFactory,否则@Json注解不会生效。正确的实例创建代码应该是:val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) .build()再把这个Moshi实例传给Retrofit:
val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(MoshiConverterFactory.create(moshi)) .build()排查自定义组件是否修改了键名
检查项目里有没有自定义的JsonAdapter,或者Retrofit的拦截器——这些组件可能会在序列化或发送请求时修改JSON键名。如果有,调整逻辑确保带@的键名被完整保留。手动验证序列化结果
直接用Moshi序列化你的数据类,看生成的JSON是否包含@Keyname键,快速定位是Moshi的问题还是Retrofit传输环节的问题:val data = YourDataClass(Keyname = "test") val jsonAdapter = moshi.adapter(YourDataClass::class.java) val jsonString = jsonAdapter.toJson(data) println(jsonString) // 正常输出应该是{"@Keyname":"test"}极端情况:自定义适配器强制生成键名
如果上面的方法都无效,写一个自定义JsonAdapter来确保键名正确输出:class YourDataClassAdapter { @ToJson fun toJson(data: YourDataClass): Map<String, String> { return mapOf("@Keyname" to data.Keyname) } @FromJson fun fromJson(map: Map<String, String>): YourDataClass { return YourDataClass(map["@Keyname"] ?: "") } }然后把这个适配器添加到Moshi实例中:
val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) .add(YourDataClassAdapter()) .build()
内容的提问来源于stack exchange,提问作者Danial clarc
相关产品推荐
相关产品推荐

