Скала раскусить с отсутствующим полем
Как я могу распаковать объект с полем, которое может пропустить (и использовать ноль) в этом случае?
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.
2 ответа
Насколько я понимаю, скала травления не может обрабатывать пропущенные поля.
Если мы посмотрим на вывод о том, как соленые огурцы 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))
Просто объявите это, имея тип Option[String]
, как это:
case class Person(name: Option[String], age: Int)
Option[T]
это идиоматический способ обработки значений в Scala, который в противном случае (например, в Java) может быть null