我正在构建一个模式生成器,并试图获得枚举值的JsonProperty
,例如,这个类:
enum class Size {
@JsonProperty("really-tall") TALL,
@JsonProperty("really-grande") GRANDE;
}
我想要一张"really-tall", "really-grande"
单子。
如何访问枚举的注释?谢谢!
更新:
基于此回复的通用KType
解决方案
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
}
发布于 2022-08-13 16:29:57
最新情况:任择议定书的补充问题
如何使第一种方法适用于通用KType
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可能会显示出对declaringClass
在getJsonPropertyAnnotations
中的错误替换的弃用警告。我想这将在以后的版本中解决。链接到相关源
下面的代码应该做您想做的事情。
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而不是枚举值。
enum class Size(@get:JsonValue val someFieldName: String) {
TALL("really-tall"),
GRANDE("really-grande");
}
同样的测试
class SomeTest : StringSpec({
"getting prop values" {
val result = enumValues<Size>().map {
it.someFieldName
}
result shouldBe listOf("really-tall", "really-grande")
}
})
我们在一个正在进行的项目中使用后一种方法。
发布于 2022-08-18 17:45:37
下面是用户@aSemy所建议的技术的Kotlin实现。
它是ObjectMapper上的一个扩展函数,用于询问映射程序如何序列化枚举的值。这比检查@JsonProperty
注释更健壮,因为它与@JsonValue
以及在映射器中注册的任何自定义注释内省一起工作。
inline fun <reified T : Enum<T>> ObjectMapper.enumValues() : List<String> {
return convertValue(
kotlin.enumValues<T>(),
jacksonTypeRef<List<String>>()
)
}
用法:
println(jsonMapper().enumValues<Size>())
https://stackoverflow.com/questions/73345887
复制相似问题