首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得Kotlin中枚举值的Jackson JsonProperty?

如何获得Kotlin中枚举值的Jackson JsonProperty?
EN

Stack Overflow用户
提问于 2022-08-13 16:17:21
回答 2查看 258关注 0票数 1

我正在构建一个模式生成器,并试图获得枚举值的JsonProperty,例如,这个类:

代码语言:javascript
运行
复制
enum class Size {
    @JsonProperty("really-tall") TALL,
    @JsonProperty("really-grande") GRANDE;
}

我想要一张"really-tall", "really-grande"单子。

如何访问枚举的注释?谢谢!

更新:

基于此回复的通用KType解决方案

代码语言:javascript
运行
复制
return (jvmErasure.java as Class<Enum<*>>)
  .enumConstants
  .map {
    it.javaClass.getField(it.name).getAnnotation(JsonProperty::class.java)?.value // Get the JsonProperty string first if exists
      ?: it.name
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-13 16:29:57

最新情况:任择议定书的补充问题

如何使第一种方法适用于通用KType

代码语言:javascript
运行
复制
inline fun <reified T : Enum<T>> getJsonPropertyAnnotations() = enumValues<T>().map {
    it.declaringClass
        .getField(it.name)
        .getAnnotation(JsonProperty::class.java)
        .value
}

class SomeTest : StringSpec({
    "getJsonPropertyAnnotations" {
        getJsonPropertyAnnotations<Size>() 
            shouldBe listOf("really-tall", "really-grande")
    }
})

请注意,使用Kotlin1.7时,IntelliJ可能会显示出对declaringClassgetJsonPropertyAnnotations中的错误替换的弃用警告。我想这将在以后的版本中解决。链接到相关源

下面的代码应该做您想做的事情。

代码语言:javascript
运行
复制
class SomeTest : StringSpec({
    "getting annotation values" {
        val result = enumValues<Size>().map {
            it.declaringClass.getField(it.name).getAnnotation(JsonProperty::class.java).value
        }
        result shouldBe listOf("really-tall", "really-grande")
    }
})

另一种方法(更少的代码):向枚举类中添加一个String属性(在下面的代码中我称之为someFieldName ),用@get:JsonValue注释,并用您想要的字符串值构造每个枚举条目。在序列化期间,@get:JsonValue将使用someFieldName而不是枚举值。

代码语言:javascript
运行
复制
enum class Size(@get:JsonValue val someFieldName: String) {
    TALL("really-tall"),
    GRANDE("really-grande");
}

同样的测试

代码语言:javascript
运行
复制
class SomeTest : StringSpec({
    "getting prop values" {
        val result = enumValues<Size>().map {
            it.someFieldName
        }
        result shouldBe listOf("really-tall", "really-grande")
    }
})

我们在一个正在进行的项目中使用后一种方法。

票数 1
EN

Stack Overflow用户

发布于 2022-08-18 17:45:37

下面是用户@aSemy所建议的技术的Kotlin实现。

它是ObjectMapper上的一个扩展函数,用于询问映射程序如何序列化枚举的值。这比检查@JsonProperty注释更健壮,因为它与@JsonValue以及在映射器中注册的任何自定义注释内省一起工作。

代码语言:javascript
运行
复制
inline fun <reified T : Enum<T>> ObjectMapper.enumValues() : List<String> {
    return convertValue(
        kotlin.enumValues<T>(),
        jacksonTypeRef<List<String>>()
    )
}

用法:

代码语言:javascript
运行
复制
println(jsonMapper().enumValues<Size>())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73345887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档