0

その場合、欠落する可能性がある (そして null を使用する) フィールドを持つオブジェクトを unpickle するにはどうすればよいですか?

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

Option[String]次のように、 type を持つと宣言するだけです。

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

Option[T]値を処理するための慣用的な Scala の方法です (Java など)。null

于 2015-07-25T12:14:21.183 に答える
1

私の理解では、scala-pickling は不足しているフィールドを処理できません。

how 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)

アルゴノートで:

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 に答える