jackson Kotlin:对象Map器.readValue()无法推断参数

pbpqsu0x  于 2022-11-08  发布在  Kotlin
关注(0)|答案(3)|浏览(137)

我想用下面的代码反序列化一个json到Map对象Map器:

fun onMessage(topic: String, message: MqttMessage) {
   val typeRef = object : TypeReference<HashMap<String, String>>() {}
   val msg = objectMapper.readValue(message.payload, typeRef)
   ...
}

编译器表示无法推断fun <T : Any!> readValue (src: ByteArray!, valueTypeRef: (TypeReference<Any!>..TypeReference<*>?)): T!中的参数T
如果不使用我的自定义类扩展HashMap,是否有解决此问题的方法:

class MyHashMap : HashMap<String, String>()

...

fun onMessage(topic: String, message: MqttMessage) {
   val msg = objectMapper.readValue(message.payload, MyHashMap::class.java)
   ...
}
3htmauhk

3htmauhk1#

实际上,问题出在Jackson的API中。下面是readValue方法的声明方式:

public <T> T readValue(String content, TypeReference valueTypeRef)

由于某种原因,它们使用了TypeReference的原始类型,即使它们可以很容易地将TypeReference<T>作为参数。如果它们这样做了,您的代码将按原样工作,因为Kotlin可以推断函数的T泛型类型参数,从而知道其返回类型。
但是,您可以通过显式地使用类型来解决此问题。

  • 提供函式的泛型型别参数,并推断出msg变数的型别:
val msg = objectMapper.readValue<HashMap<String, String>>(message.payload, typeRef)
  • 或者显式键入变量,并推断函数的类型参数:
val msg: HashMap<String, String> = objectMapper.readValue(message.payload, typeRef)
thtygnil

thtygnil2#

一种可能的方式是:

inline fun <reified T> ObjectMapper.readValue(s: String): T = this.readValue(s, object : TypeReference<T>() {})

val msg: Map<String,String> = objectMapper.readValue(message.payload)
b91juud3

b91juud33#

您可以使用对象运算式来传递TypeReference的匿名实作:

objectMapper.readValue(message.payload, object: TypeReference<HashMap<String, String>>() {})

请注意TypeReference参数之前的object:保留字。

相关问题