Написание пользовательского объекта 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)
}
}