Написание пользовательского объекта JSON как простого значения в Scala (JSON Reads/Writes)

У меня есть собственный тип данных в Scala:

case class GPID(value: Int) {
    // ... other stuff ...

    implicit val writesGPID = new Writes[GPID] {
        def writes(g: GPID): JsValue = {
            Json.obj(
                "GPID" -> g.value
            )
        }
    }

    implicit val reads: Reads[GPID] = (
        (__ \ "GPID").read[Int]
        ).map(GPID(_))
}

Как вы можете видеть, у него есть метод чтения / записи, но это приводит к выводу примерно так:

"Идентификатор":{"GPID":1000}

Но мы просто хотим, чтобы он сериализовался / десериализовался как обычный Int:

"Идентификатор": 1000

Я пытался выяснить, как переписать чтение / запись, но мне не повезло... Любой совет будет оценен!

Спасибо.

1 ответ

Решение

Я добавил некоторую проверку, измените ваши потребности.

object GPID {
  def unapply(in: Int): Option[GPID] = Option(in).filter(_ > 0).map(apply)

  implicit val reads = new Reads[GPID] {
    def reads(in: JsValue) =
      Option(in)
        .flatMap {
          case JsNumber(value) => Some(value)
          case _ => None
        }
        .flatMap(num => unapply(num.toInt))
        .map(JsSuccess(_, __))
        .getOrElse(JsError(__, "validate.error.expected.GPID"))
  }

  implicit val writes = new Writes[GPID] {
    def writes(g: GPID) = JsNumber(g.value)
  }

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