【问题标题】:JSON key is missing (using @JsonComponent on Spring-boot with kotlin)缺少 JSON 密钥(在带有 kotlin 的 Spring-boot 上使用 @JsonComponent)
【发布时间】: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})。

我不能在数据类上使用isAdminname吗?

你知道为什么会出现这个问题吗?

谢谢。

【问题讨论】:

    标签: spring-boot kotlin jackson


    【解决方案1】:

    这是 kotlin 中 jackson 的一个已知问题。 Jackson 基本上试图从名称中删除 is,但 kotlin 数据类实现没有正确的 getter,没有“is”导致不匹配。您可以将JsonProperty("isAdmin") 添加到变量中,它应该可以工作。

    data class HaveBoolean(
        @get:JsonProperty("isAdmin")
        val isAdmin: BooleanValue,
    )
    

    【讨论】:

      猜你喜欢
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 2016-06-02
      • 2018-01-26
      相关资源
      最近更新 更多