You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:45:45