0

我在 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(_))
}

如您所见,它有一个读/写方法,但这会导致如下输出:

“id”:{“GPID”:1000}

但是,我们只希望它像常规 Int 一样序列化/反序列化:

“身份证”:1000

我一直在试图弄清楚如何重写读/写,但运气不佳......任何建议将不胜感激!

谢谢你。

4

1 回答 1

2

我添加了一些验证,根据您的需要进行修改。

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)
  }

}
于 2015-05-20T08:11:56.440 回答