如何在upickle中读取带有由丢失字段序列化的可选字段的json

我使用upickle在scalajs中序列化json。我需要能够解析由空值和缺少的字段(网络上的标准json)表示的可选字段。

使用OptionPickler,我可以接受可为空的项目。 但是,如何接受缺少的字段? 下面的示例处理空name字段,但在缺少的address字段上失败。

// from http://www.lihaoyi.com/upickle/ -> object OptionPickler
object OptionPickler extends upickle.Attributetagged {
  override implicit def OptionWriter[T: Writer]: Writer[Option[T]] =
    implicitly[Writer[T]].comap[Option[T]] {
      case None => null.asInstanceOf[T]
      case Some(x) => x
    }

  override implicit def OptionReader[T: Reader]: Reader[Option[T]] = {
    new Reader.Delegate[Any,Option[T]](implicitly[Reader[T]].map(Some(_))) {
      override def visitNull(index: Int) = None
    }
  }
}

case class Person(id: Int,name: Option[String],address: Option[String])
implicit val personRW: OptionPickler.ReadWriter[Person] = OptionPickler.macroRW[Person]
val personJson = """{"id": 1,"name": null}"""
println(OptionPickler.read[Person](personJson))

Exception: upickle.core.Abort: missing keys in dictionary: address
wangxiqiang 回答:如何在upickle中读取带有由丢失字段序列化的可选字段的json

尝试为default arguments提供None example

import upickle.default._

case class Person(id: Int,name: Option[String] = None,address: Option[String] = None)
implicit val personRW: ReadWriter[Person] = macroRW
val personJson = """{"id": 1,"name": null}"""
read[Person](personJson)

将缺少的字段反序列化为None

res1: Person = Person(1,null,None)
本文链接:https://www.f2er.com/3166302.html

大家都在问