缺少 JSON 密钥(在带有 kotlin 的 Spring-boot 上使用 @JsonComponent)
Posted
技术标签:
【中文标题】缺少 JSON 密钥(在带有 kotlin 的 Spring-boot 上使用 @JsonComponent)【英文标题】:JSON key is missing (using @JsonComponent on Spring-boot with kotlin) 【发布时间】:2021-11-25 12:41:43 【问题描述】:感谢阅读这个问题。
这个问题让我很困惑。 我创建了响应 JSON 数据的代码,如下所示。
@RestController
class JsonTestController
@GetMapping("jsonTest")
fun jsonTest(): ResponseEntity<HaveBoolean>
val value = BooleanValue(true)
return ResponseEntity.ok(HaveBoolean(value))
data class BooleanValue(val value: Boolean)
data class HaveBoolean(
val isAdmin: BooleanValue,
)
@JsonComponent 在下面。
@JsonComponent
class BooleanValueJson
class Serializer : JsonSerializer<JsonTestController.BooleanValue>()
override fun serialize(value: JsonTestController.BooleanValue, gen: JsonGenerator, serializers: SerializerProvider)
gen.writeBoolean(value.value)
class Deserializer : JsonDeserializer<JsonTestController.BooleanValue>()
override fun deserialize(p: JsonParser, ctxt: DeserializationContext): JsonTestController.BooleanValue =
JsonTestController.BooleanValue(p.valueAsBoolean)
当我请求 localhost://8082/jsonTest
时,我得到了空的 json ()。
但是,我尝试了其他变量名称,例如
hoge
,意思是如下编码。
data class HaveBoolean(
val hoge: BooleanValue,
)
然后,我再次请求,我可以正确获取 json ("hoge": true
)。
我不能在数据类上使用isAdmin
name吗?
你知道为什么会出现这个问题吗?
谢谢。
【问题讨论】:
【参考方案1】:这是 kotlin 中 jackson 的一个已知问题。 Jackson 基本上试图从名称中删除 is
,但 kotlin 数据类实现没有正确的 getter,没有“is”导致不匹配。您可以将JsonProperty("isAdmin")
添加到变量中,它应该可以工作。
data class HaveBoolean(
@get:JsonProperty("isAdmin")
val isAdmin: BooleanValue,
)
【讨论】:
以上是关于缺少 JSON 密钥(在带有 kotlin 的 Spring-boot 上使用 @JsonComponent)的主要内容,如果未能解决你的问题,请参考以下文章
带有 Postman 的 FCM - 请求缺少身份验证密钥(FCM 令牌)
如何使用带有 Kotlin 的 Room 和 moshi 持久化带有 JSON 数组的 JSON 对象
如何使用带有 Kotlin 的 Gson 库访问 JSON 有效负载中的嵌套值