缺少字段的Scala unpickle



在这种情况下,我如何解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))

相关内容

  • 没有找到相关文章