2

play! の json コンビネータを使用して、JSON の検証、読み取り、書き込みを行っています。設定されていない場合、読み取りまたは書き込みでデフォルト値を指定することはできますか?

json の検証は次のように行われます (json は JsValue です)。

json.validate[Pricing]

私のコードは次のとおりです。

case class Pricing(
    _id: ObjectId = new ObjectId,
    description: String,
    timeUnit: TimeUnit.Value,
    amount: Double = 0.0) {
        @Persist val _version = 1
}

私の読み書き:

implicit val pricingReads: Reads[Pricing] = (
    (__ \ "_id").read[ObjectId] and
    (__ \ "description").read[String] and
    (__ \ "timeUnit").read[TimeUnit.Value] and
    (__ \ "amount").read[Double]
)(Pricing.apply _)

implicit val pricingWrites: Writes[Pricing] = (
    (__ \ "_id").write[ObjectId] and
    (__ \ "description").write[String] and
    (__ \ "timeUnit").write[TimeUnit.Value] and
    (__ \ "amount").write[Double]
)(unlift(Pricing.unapply))

したがって、次のような Json を受け取る場合:

{"description": "some text", "timeUnit": "MONTH"}

フィールド_idamountが欠落しているというエラーが発生します。JsValue に直接追加せずにデフォルト値を設定する可能性はありますか?

前もって感謝します!

4

1 に答える 1

3

私はむしろOptionsを使いたい:

case class Pricing(
    _id: Option[ObjectId],
    description: String,
    timeUnit: TimeUnit.Value,
    amount: Option[Double]) {
      @Persist val _version = 1
    }

あなたをこれに置き換えますpricingReads

implicit val pricingReads: Reads[Pricing] = (
  (__ \ "_id").readNullable[ObjectId] and
  (__ \ "description").read[String] and
  (__ \ "timeUnit").read[TimeUnit.Value] and
  (__ \ "amount").readNullable[Double]
)(Pricing.apply _)

次に、コードが不足しているフィールドで機能し、これを実行できるようになります。

_id.getOrElse(new ObjectId)
于 2013-10-09T11:09:57.207 に答える