在这种情况下,我如何解pickle带有可能错过(并使用null)字段的对象?
scala> case class Person(name:String=null,age:Int)
defined class Person
scala> import scala.pickling.Defaults._, scala.pickling.json._
scala> val p2 = JSONPickle("""{"age":2}""").unpickle[Person]
scala.pickling.PicklingException: No field 'name' when unpickling, tag Person, fields were Map(age -> 2.0)
我需要这个,以便解pickle来自浏览器的字符串,也缺少类型字段,所以我将无法使用Option/Some/None类型。
就声明它的类型为Option[String]
,像这样:
case class Person(name: Option[String], age: Int)
Option[T]
是Scala处理值的惯用方式,否则(例如在Java中)可能是null
根据我的理解,scala-pickling不能处理缺失的字段。
如果我们看看scala-pickle如何腌制Option
的输出:
Some(9).pickle
// JSONPickle({
// "$type": "scala.Some[scala.Int]",
// "x": 9
// })
case class TestA(x: Option[Int])
TestA(None).pickle
// JSONPickle({
// "$type": "TestA",
// "x": {
// "$type": "scala.None.type"
// }
// })
你可以使用json库而不是序列化库。
给出json和case类的可选名称:
case class Person(name:Option[String], age:Int)
val json = """{"age":2}"""
与json4s: import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.native.JsonMethods._
parse(json).extract[Person]
// Person = Person(None,2)
与argonaut:
import argonaut._, Argonaut._
implicit def PersonCodecJson =
casecodec2(Person.apply, Person.unapply)("name", "age")
json.decodeOption[Person]
// Option[Person] = Some(Person(None,2))