看起来你将从一个泡菜开始解封到一个案例类。但是可以将 JSON 字符串提供给 JSONPickle 类以获取起始泡菜。
这是一个基于他们的 array-json 测试的示例
package so
import scala.pickling._
import json._
case class C(arr: Array[Int]) { override def toString = s"""C(${arr.mkString("[", ",", "]")})""" }
object PickleTester extends App {
val json = """{"arr":[ 1, 2, 3 ]}"""
val cPickle = JSONPickle( json )
val unpickledC: C = cPickle.unpickle[C]
println( s"$unpickledC, arr.sum = ${unpickledC.arr.sum}" )
}
打印的输出是:
C([1,2,3]), arr.sum = 6
我能够从测试中删除“tpe”以及从测试中删除.stripMargin.trim
输入 JSON。它在一行中起作用,但我认为它可能会更明显地分开。我不清楚测试中的“tpe”是否应该为传入的 JSON 提供类型安全的度量。
看起来他们支持酸洗的唯一其他类是 BinaryPickle 除非你想自己动手。最新的 scala-pickling 快照 jar需要 quasiquotes来编译此答案中的代码。
今天早上我尝试了一些更复杂的东西,发现传入的 JSON 中的非原始数据需要“tpe” - 这指出序列化的字符串确实必须与 pickler 兼容(我将其混合到上面的代码中):
case class J(a: Option[Boolean], b: Option[String], c: Option[Int]) { override def toString = s"J($a, $b, $c)" }
...
val jJson = """{"a": {"tpe": "scala.None.type"},
| "b":{"tpe": "scala.Some[java.lang.String]","x":"donut"},
| "c":{"tpe": "scala.Some[scala.Int]","x":47}}"""
val jPickle = JSONPickle( jJson.stripMargin.trim )
val unpickledJ: J = jPickle.unpickle[J]
println( s"$unpickledJ" )
...
自然地,我不得不使用.value
aJ(None, Some("donut"), Some(47))
来确定如何创建jJson
输入值以防止 unpickling 引发异常。
的输出J
如下:
J(None, Some(donut), Some(47))
看看这个测试,如果传入的 JSON 是 JSONPickle 魔法起作用的所有基元或案例类(或组合),但像 Options 这样的其他一些类需要额外的“tpe”类型信息才能正确解压。