Скала раскусить с отсутствующим полем

Как я могу распаковать объект с полем, которое может пропустить (и использовать ноль) в этом случае?

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

Другие вопросы по тегам