我正试图找到一个基本的上瘾的例子来工作,似乎我在这里遗漏了一些东西.我想尝试在自述文件页面上提供的upickle示例
import upickle._
sealed trait A
@key("Bee") case class B(i: Int) extends A
case object C extends A
Run Code Online (Sandbox Code Playgroud)
然后,我的代码是:
object Model {
def main(args: Array[String]): Unit = {
val a = B(5): A
println(a)
val out = write(a)
println(out)
val a2 = read[A](out)
println(a2)
println(a == a2)
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的只是错误:
引用的特征[[A]]没有任何子类.这可能由于scalac(SI-7046)的限制而发生,因为该特征不在同一包装中.如果是这种情况,则可以使用整数常量来定义层次结构.
我有两个问题:
我使用uPickle/ScalaJS使用此代码片段将js.Dynamic对象反序列化为case类:
read[myClass](JSON.stringify(dynObj))
Run Code Online (Sandbox Code Playgroud)
其中myClass是case类,dynObj是js.Dynamic对象.
有没有样板,更简单的方法吗?
为了序列化一个case类,我已经能够使用这个例子作为起点,使用Shapeless序列化为js.Dynamic:
使用Shapeless将嵌套的case类转换为嵌套的Maps
我希望能够使用uPickle代替这一点.如何用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 = …Run Code Online (Sandbox Code Playgroud)