JSON 密钥丢失(在 Spring-boot 上使用 @JsonComponent 和 kotlin)
JSON key is missing (using @JsonComponent on Spring-boot with kotlin)
感谢阅读这个问题。
这个问题让我很困惑。
我创建了响应 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}
).
我不能在数据 class 上使用 isAdmin
‖name 吗?
你知道为什么会出现这个问题吗?
谢谢。
这是 kotlin 中 jackson 的一个已知问题。 Jackson 基本上试图从名称中删除 is
但 kotlin 数据 class 实现没有正确的 getter 没有“是”导致不匹配。您可以将 JsonProperty("isAdmin")
添加到变量中,它应该可以工作。
data class HaveBoolean(
@get:JsonProperty("isAdmin")
val isAdmin: BooleanValue,
)
感谢阅读这个问题。
这个问题让我很困惑。 我创建了响应 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}
).
我不能在数据 class 上使用 isAdmin
‖name 吗?
你知道为什么会出现这个问题吗?
谢谢。
这是 kotlin 中 jackson 的一个已知问题。 Jackson 基本上试图从名称中删除 is
但 kotlin 数据 class 实现没有正确的 getter 没有“是”导致不匹配。您可以将 JsonProperty("isAdmin")
添加到变量中,它应该可以工作。
data class HaveBoolean(
@get:JsonProperty("isAdmin")
val isAdmin: BooleanValue,
)