Kotlin 如何从类型名中获取类名?
我试图使用Jackson和Kotlin将Json字符串反序列化为类型为Kotlin 如何从类型名中获取类名?,kotlin,Kotlin,我试图使用Jackson和Kotlin将Json字符串反序列化为类型为OperationResult的对象 我需要像这样构造一个类型对象: val mapper : ObjectMapper = ObjectMapper(); val type : JavaType = mapper.getTypeFactory() .constructParametricType(*/ class of OperationResult */,, /* class of
OperationResult
的对象
我需要像这样构造一个类型对象:
val mapper : ObjectMapper = ObjectMapper();
val type : JavaType = mapper.getTypeFactory()
.constructParametricType(*/ class of OperationResult */,,
/* class of String */);
val result : OperationResult<String> = mapper.readValue(
responseString, type);
val映射器:ObjectMapper=ObjectMapper();
val type:JavaType=mapper.getTypeFactory()
.ConstructParameterType(*/OperationResult类*/,),,
/*字符串类*/);
val结果:OperationResult=mapper.readValue(
负责人(类型);
我试过以下方法,但都不管用
val type : JavaType = mapper.getTypeFactory()
.constructParametricType(
javaClass<OperationResult>,
javaClass<String>); // Unresolved javaClass<T>
val type : JavaType = mapper.getTypeFactory()
.constructParametricType(
OperationResult::class,
String::class);
val-type:JavaType=mapper.getTypeFactory()
.参数类型(
javaClass,
javaClass);//未解析的javaClass
val type:JavaType=mapper.getTypeFactory()
.参数类型(
OperationResult::类,
字符串::类);
如何从类型名称中获取java类?以下操作与预期一样有效:
val type = mapper.typeFactory.constructParametricType(OperationalResult::class.java, String::class.java)
val operationalResult = mapper.readValue<OperationalResult<String>>("""{"result":"stack"}""", type)
println(operationalResult.result) // -> stack
val type=mapper.typeFactory.ConstructParameterType(OperationalResult::class.java,String::class.java)
val operationalResult=mapper.readValue(“{”结果“:“堆栈”}”,类型)
println(operationalResult.result)/>堆栈
反序列化泛型类型的更简单的替代方法是使用:
val operationalResult=mapper.readValue(“{”结果“:“5.5”}”),
对象:TypeReference(){})
println(operationalResult.result)/->5.5
在计算机的帮助下,你甚至可以写:
val operationalResult = mapper.readValue<OperationalResult<Long>>("""{"result":"5"}""")
println(operationalResult.result)
val operationalResult=mapper.readValue(“{”结果“:“5”}”)
println(operationalResult.result)
以下各项按预期工作:
val type = mapper.typeFactory.constructParametricType(OperationalResult::class.java, String::class.java)
val operationalResult = mapper.readValue<OperationalResult<String>>("""{"result":"stack"}""", type)
println(operationalResult.result) // -> stack
val type=mapper.typeFactory.ConstructParameterType(OperationalResult::class.java,String::class.java)
val operationalResult=mapper.readValue(“{”结果“:“堆栈”}”,类型)
println(operationalResult.result)/>堆栈
反序列化泛型类型的更简单的替代方法是使用:
val operationalResult=mapper.readValue(“{”结果“:“5.5”}”),
对象:TypeReference(){})
println(operationalResult.result)/->5.5
在计算机的帮助下,你甚至可以写:
val operationalResult = mapper.readValue<OperationalResult<Long>>("""{"result":"5"}""")
println(operationalResult.result)
val operationalResult=mapper.readValue(“{”结果“:“5”}”)
println(operationalResult.result)
您需要获取类
而不是KClass
的实例。要获得它,只需使用::class.java
而不是::class
val type : JavaType = mapper.typeFactory.constructParametricType(OperationResult::class.java, String::class.java)
您需要获取
Class
而不是KClass
的实例。要获得它,只需使用::class.java
而不是::class
val type : JavaType = mapper.typeFactory.constructParametricType(OperationResult::class.java, String::class.java)
当使用Jackson、GSON或其他实例化Kotlin对象的库时,Kotlin有一些问题会引起关注。一是如何获得
类
、TypeToken
、TypeReference
或其他一些库想要了解的专门类。另一个问题是如何构造不总是具有默认构造函数或不可变的类
对于Jackson,专门构建了一个模块来涵盖这些案例。@miensol的回答中提到了这一点。他举了一个类似的例子:
import com.fasterxml.jackson.module.kotlin.* // added for clarity
val operationalResult: OperationalResult<Long> = mapper.readValue(""{"result":"5"}""")
您可以很容易地编写相同的代码,但是模块中有大量这样的助手来为您完成这项工作。此外,它还能够为您调用非默认构造函数和静态工厂方法。在Jackson 2.8.+中,它还可以更智能地处理nullability和默认方法参数(允许JSON中缺少值,因此使用默认值)。如果没有模块,您很快就会发现新的错误
至于使用mapper.typeFactory.constructParameterType
,您应该使用TypeReference
,它更简单,并且遵循与上面相同的模式
val myTypeRef = object: TypeReference<SomeOtherClass>() {}
val myTypeRef=object:TypeReference(){}
此代码(通过)创建一个类的匿名实例,该类的超级类型为typereference
,并指定了泛型类。Java反射可以查询这些信息
直接使用Class
时要小心,因为它会删除泛型类型信息,因此使用SomeOtherClass::Class
或SomeOtherClass::Class.java
都会丢失泛型,对于需要了解泛型的事情,应该避免使用
因此,即使你不使用Jackson Kotlin模块也能侥幸逃脱,你很快就会遇到很多麻烦。本模块不必损坏Kotlin,而是可以删除这些类型的错误,并让您以“Kotlin方式”完成更多工作。Kotlin在使用Jackson、GSON或其他实例化Kotlin对象的库时,有一些问题会引起关注。一是如何获得
类
、TypeToken
、TypeReference
或其他一些库想要了解的专门类。另一个问题是如何构造不总是具有默认构造函数或不可变的类
对于Jackson,专门构建了一个模块来涵盖这些案例。@miensol的回答中提到了这一点。他举了一个类似的例子:
import com.fasterxml.jackson.module.kotlin.* // added for clarity
val operationalResult: OperationalResult<Long> = mapper.readValue(""{"result":"5"}""")
您可以很容易地编写相同的代码,但是模块中有大量这样的助手来为您完成这项工作。此外,它还能够为您调用非默认构造函数和静态工厂方法。在Jackson 2.8.+中,它还可以更智能地处理nullability和默认方法参数(允许JSON中缺少值,因此使用默认值)。如果没有模块,您很快就会发现新的错误
至于使用mapper.typeFactory.constructParameterType
,您应该使用TypeReference
,它更简单,并且遵循与上面相同的模式
val myTypeRef = object: TypeReference<SomeOtherClass>() {}
val myTypeRef=object:TypeReference(){}
此代码(通过)创建一个类的匿名实例,该类的超级类型为typereference