如何在kotlin中为Arrow';谁的选择?

如何在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

我需要将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(), 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()
而不是手动检查空值。