Dav*_*lla 5 json scala scala-option upickle
我使用 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
Run Code Online (Sandbox Code Playgroud)
小智 2
我解决了这个问题。我有案例类Request。我可以从请求中获取架构,也可以不获取架构。我按如下方式处理该请求:
import upickle.default.{ReadWriter => RW, _}
case class Request(id: Long, name: String, schema: Option[String])
implicit lazy val deserializer: Reader[Request] =
reader[ujson.Obj].map[Request](json => Request(
read[Long](json("id")),
read[String](json("name")),
if (json.obj.contains("schema")) { Option(read[String](json("schema"))) } else None
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
337 次 |
| 最近记录: |