如何使用 lift-json 将 json 数组反序列化为 scala 向量?
例如:
case class Foo(bar: Vector[Bar])
trait Bar {
def value: Int
}
case class Bar1(value: Int) extends Bar
case class Bar2(value: Int) extends Bar
import net.liftweb.json.{ShortTypeHints, Serialization, DefaultFormats}
implicit val formats = new DefaultFormats {
override val typeHintFieldName = "type"
override val typeHints = ShortTypeHints(List(classOf[Foo],classOf[Bar1],classOf[Bar2]))
}
println(Serialization.writePretty(Foo(Vector(Bar1(1), Bar2(5), Bar1(1)))))
结果是:
{
"type":"Foo",
"bar":[{
"type":"Bar1",
"value":1
},{
"type":"Bar2",
"value":5
},{
"type":"Bar1",
"value":1
}]
}
好的。但是当我尝试反序列化这个字符串时
println(Serialization.read[Foo](Serialization.writePretty(Foo(Vector(Bar1(1), Bar2(5), Bar1(1))))))
我得到一个例外:
net.liftweb.json.MappingException:解析的 JSON 值与类构造函数不匹配 args=List(Bar1(1), Bar2(5), Bar1(1)) arg types=scala.collection.immutable.$colon$colon 构造函数=public test.Foo(scala.collection.immutable.Vector)
这意味着与 Scala 列表相关联的 json 数组,而不是类 Foo 中定义的向量类型。我知道有办法通过扩展 net.liftweb.json.Serializer 来创建自定义序列化程序并将其包含到格式值中。但是我怎样才能恢复存储在 Vector 中的对象类型。我想得到这样的反序列化结果:
Foo(向量(Bar1(1), Bar2(5), Bar1(1)))