2013-12-17 5 views
6

こんにちは、JSONボディパーサーに問題があります。 私の問題は、いくつかのオプションのパラメータ(Option [T])とOption [T]としてタイプしたくないデフォルト値のパラメータを持つケースクラスがあることです。PlayスカラJSONボディパーサーのデフォルト値フィールド

は、しかし、私はここでエラー

play.api.libs.JsError 
/count error path missing 

を取得する省略時のデフォルト値を持つフィールドを持つJSON本体を解析するときには、私のコントローラのコードは次のとおりです。ここで

object MyController extends Controller{ 


    implicit val itemWrites = Json.writes[Item] 
    implicit val itemReads = Json.reads[Item] 
    implicit val itemFormats = Json.format[Item] 

    def add = DBAction(parse.json){ implicit rs => 

    val item = rs.request.body.validate[Item] 
} 

は、私の場合クラスです:

case class Item(id:Option[Int], name:String, description:Option[String], count:Int=0) 

私はOption [T]と同じ動作をデフォルト値フィールドで実現できますか?

おかげで私が使用している

  • Scalaの2.10
  • プレイフレームワーク2.2.1
  • プレイ - スリックプラグイン0.5.0.8

答えて

4
+0

こんにちは、ありがとう、私はむしろオプションがありません。あなたが提供したリンクについて。ユーザーは彼の現在の解決策にはいくつかの欠点があり、私は同意する必要があると言わなければならない。しかし、よりよい解決策が提示されない場合、私は道を見ていないので、私は彼のアプローチを使用して最終的に解決します – ufasoli

+0

最高の解決策は、withDefaultを自動的に作成するマクロを作成することですが、これはかなり手がかりです:( – Jean

+0

はいかなり多くの努力が... – ufasoli

1

回避策の一つは、書くことになります:あなたは間違いなくオプションを使用しない場合、あなたはここで見ることができ

case class Item(description:Option[String] = Some("String")) 

:あなたはこのようなオプションでデフォルト値を定義することができますcountのデフォルト値をオプションとして受け取り、施工を処理するapplyメソッド(読み取りを構築するときに明白な名前が必要なので、適用する名前を付けることはできません):

object Item{ 
    def applyOpt(id:Option[Int], name:String, description:Option[String], count:Option[Int]): Item = count.map{c => 
    Item(id, name, description, c) 
    }.getOrElse{ 
    Item(id, name, description) 
    } 
} 
あなたはいくつかのデフォルトのフィールドを持っている場合は特に、理想的ではない確かに

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 


implicit val itemReads: Reads[Item] = (
    (__ \ "id").readNullable[Int] and 
    (__ \ "name").read[String] and 
    (__ \ "description").readNullable[String] and 
    (__ \ "count").readNullable[Int] 
)(Item.applyOpt _) 

が、する必要がなくなり、迅速な回避策:

その後、オプションapplyOptへ[のInt]を渡しますこれは、デフォルト値のためreadNullableを使用することができますマクロやリフレクションを扱う。

+0

はい、私は、同じシナリオでは多くのケースクラスがありますが、モデルがまだ作成されていないときには書くのが面倒で、エラーが発生しやすいフィールドが多いため、すべてのフィールドを持つReaderを書くことを避けたいと考えていました100%安定していて、それを更新する必要がある、私はジャクソンがJavaでやっているように – ufasoli

関連する問題