首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在upickle中使用由缺失字段序列化的可选字段读取json

如何在upickle中使用由缺失字段序列化的可选字段读取json
EN

Stack Overflow用户
提问于 2019-11-04 13:42:48
回答 1查看 612关注 0票数 7

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

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

代码语言:javascript
复制
// 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
EN

回答 1

Stack Overflow用户

发布于 2021-12-10 14:31:15

我解决了这个问题。我有case类请求。我可以从请求中获得模式,也可以不是从请求中获取模式。我按以下方式处理这一请求:

代码语言:javascript
复制
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
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58694672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档