0

在这种情况下,如何使用可能丢失(并使用空值)的字段来取消对象?

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)

我需要这个来解开来自浏览器的字符串,该字符串也缺少类型字段,因此我将无法使用 Option/Some/None 类型。

4

2 回答 2

1

据我了解,scala-pickling 无法处理缺失的字段。

如果我们看一下 scala-pickle pickles 的输出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))
于 2015-07-25T12:31:57.430 回答
1

只需声明它具有 type Option[String],如下所示:

case class Person(name: Option[String], age: Int)

Option[T]是处理值的惯用 Scala 方式,否则(例如在 Java 中)可能是null

于 2015-07-25T12:14:21.183 回答