как читать json с необязательным полем, сериализованным пропущенным полем, в upickle - PullRequest
1 голос
/ 04 ноября 2019

Я использую upickle для сериализации json в scalajs. Мне нужно иметь возможность анализировать необязательные поля, представленные нулевым значением и отсутствующим полем (стандартный json в Интернете).

С OptionPickler я могу принимать элементы, допускающие обнуление. Тем не менее, как я могу принять пропущенные поля? В этом примере ниже обрабатывается нулевое поле name, но в пропущенном поле address происходит сбой.

// from http://www.lihaoyi.com/upickle/ -> object OptionPickler
object OptionPickler extends upickle.AttributeTagged {
  override implicit def OptionWriter[T: Writer]: Writer[Option[T]] =
    implicitly[Writer[T]].comap[Option[T]] {
      case None => null.asInstanceOf[T]
      case Some(x) => x
    }

  override implicit def OptionReader[T: Reader]: Reader[Option[T]] = {
    new Reader.Delegate[Any, Option[T]](implicitly[Reader[T]].map(Some(_))) {
      override def visitNull(index: Int) = None
    }
  }
}

case class Person(id: Int, name: Option[String], address: Option[String])
implicit val personRW: OptionPickler.ReadWriter[Person] = OptionPickler.macroRW[Person]
val personJson = """{"id": 1, "name": null}"""
println(OptionPickler.read[Person](personJson))

Exception: upickle.core.Abort: missing keys in dictionary: address
...