如何在kotlin中为Arrow';谁的选择?
我需要将json中的可选值反序列化到Kotlin中的数据类,这些数据类具有如何在kotlin中为Arrow';谁的选择?,kotlin,jackson,arrow-kt,Kotlin,Jackson,Arrow Kt,我需要将json中的可选值反序列化到Kotlin中的数据类,这些数据类具有Option类型。例如: data class Sample(val id: Long, val content: Option<String>) fun main() { val mapper = ObjectMapper() val v1 = mapper.readValue(""" { "id": "1", "content": null } """.trimIndent(), Samp
Option
类型。例如:
data class Sample(val id: Long, val content: Option<String>)
fun main() {
val mapper = ObjectMapper()
val v1 = mapper.readValue("""
{ "id": "1", "content": null }
""".trimIndent(), Sample::class.java)
val v2 = mapper.readValue("""
{ "id": "2", "content": "Some content" }
""".trimIndent(), Sample::class.java)
assert(v1.id == 1)
assert(v1.content == Option.empty())
assert(v2.id == 2)
assert(v2.content == Option.just("Some content"))
}
数据类示例(val id:Long,val content:Option)
主要内容(){
val mapper=ObjectMapper()
val v1=映射器。读取值(“”)
{“id”:“1”,“内容”:null}
“.trimIndent(),Sample::class.java)
val v2=mapper.readValue(“”)
{“id”:“2”,“内容”:“某些内容”}
“.trimIndent(),Sample::class.java)
断言(v1.id==1)
断言(v1.content==Option.empty())
断言(v2.id==2)
断言(v2.content==Option.just(“某些内容”))
}
我正在努力为这个用例编写正确版本的反序列化程序。以下是我尝试过的:
class OptionDeserializer<T>(private val clazz: Class<T>) : StdDeserializer<Option<T>>(clazz) {
override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): Option<T> {
val value = p?.codec?.readValue(p, clazz)
return if (value == null) Option.empty() else Option.just(value)
}
}
fun main() {
val mapper = ObjectMapper()
val module = SimpleModule("Option")
module.addDeserializer(Option::class.java,
OptionDeserializer(Option::class.java))
mapper.registerModule(module)
val v1 = mapper.readValue("""
{ "id": "1", "content": "Some content" }
""".trimIndent(), Sample::class.java)
assert(v1.id == 1)
assert(v1.content == Option.just("Some content"))
}
class optionSerializer(private val clazz:class):StdDeserializer(clazz){
重写有趣的反序列化(p:JsonParser?,ctxt:DeserializationContext?):选项{
val值=p?.codec?.readValue(p,clazz)
返回if(value==null)Option.empty()else Option.just(value)
}
}
主要内容(){
val mapper=ObjectMapper()
val模块=SimpleModule(“选项”)
addDeserializer(选项::class.java,
OptionDeserializer(Option::class.java))
映射器注册表模块(模块)
val v1=映射器。读取值(“”)
{“id”:“1”,“内容”:“某些内容”}
“.trimIndent(),Sample::class.java)
断言(v1.id==1)
断言(v1.content==Option.just(“某些内容”))
}
但这不起作用并引发错误:
无法构造$Sample
的实例(不存在与默认构造类似的创建者):无法从对象值反序列化(没有委托或基于属性的创建者)
在[来源:(字符串)”{
“id”:“1”,
“内容”:“一些内容”
}“行:2,列:3]
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造$Sample
的实例(不存在与默认构造类似的创建者):无法从对象值反序列化(无委托或基于属性的创建者)
在[来源:(字符串)”{
“id”:“1”,
“内容”:“一些内容”
}“行:2,列:3]
位于com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
位于com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1452)
位于com.fasterxml.jackson.databind.DeserializationContext.HandleMissingInstallator(DeserializationContext.java:1028)
在com.fasterxml.jackson.databind.deser.BeandSerializedBase.DeserializeFromObjectUsingNodefault(BeandSerializedBase.java:1297)上
在com.fasterxml.jackson.databind.deser.beandSerializer.deserializeFromObject(beandSerializer.java:326)上
在com.fasterxml.jackson.databind.deser.BeandSerializer.deserialize(BeandSerializer.java:159)上
位于com.fasterxml.jackson.databind.ObjectMapper.\u readMapAndClose(ObjectMapper.java:4013)
位于com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004)
如何让jackson使用
选项
从箭头kt键入
?您需要注册Kotlin模块
val mapper = ObjectMapper().registerModule(KotlinModule())
,以防您还没有它。错误与默认构造函数有关。声明默认构造函数或使用kotlin no arg plugin。使用
Option.fromNullable()
而不是手动检查空值。