如何在Kotlin中构造含点式键名的JSON请求体?
解决Kotlin中构造含点式键名JSON请求体的问题
嘿,这个问题我之前也踩过坑!Kotlin的标识符规则不允许属性名里包含小数点,所以直接写val user.parameter1 = parameter1肯定会报错。不过有几个实用的解决方案,能帮你生成想要的JSON结构:
方案一:使用Map构造请求体(快速直接)
如果你的请求体结构不算太复杂,直接用Map<String, Any>来构造是最省事的——因为Map的键可以是任意字符串,完全支持带点的格式:
// 假设user和parameter1是你已有的变量 val requestBody = mapOf( "user" to user, "parameters" to mapOf( "user.parameter1" to parameter1 ) )
当你把这个Map序列化为JSON时,就能得到你想要的结果:
{ "user": "...", "parameters": { "user.parameter1": "..." } }
方案二:用数据类配合序列化注解(规范易用)
如果你的请求体结构比较复杂,或者需要强类型校验,推荐用数据类加上序列化库的注解来指定JSON键名。主流的序列化库(比如Gson、Jackson)都支持这个功能:
用Gson的@SerializedName注解
// 定义参数模型 data class Parameters( @SerializedName("user.parameter1") // 指定JSON键名 val parameter1: String // 替换成你实际的类型,比如Int、Boolean等 ) // 定义请求体模型 data class RequestBody( val user: User, // 假设User是你自己的用户数据类 val parameters: Parameters ) // 创建请求体实例 val requestBody = RequestBody(user, Parameters(parameter1))
用Jackson的@JsonProperty注解
如果你用的是Jackson序列化库,语法类似,只是注解换成@JsonProperty:
data class Parameters( @JsonProperty("user.parameter1") val parameter1: String ) data class RequestBody( val user: User, val parameters: Parameters )
总结
- 简单场景选Map方案:代码少,不需要额外定义类,快速实现需求;
- 复杂/强类型场景选数据类+注解:结构清晰,易于维护,还能享受到Kotlin的类型校验优势。
内容的提问来源于stack exchange,提问作者Serge Tsarik
相关产品推荐
相关产品推荐

