0

私は次のケースクラスを持っています:

case class VirtualAssetConfigParam(
  id: Long,
  pMin: Double,
  pMax: Double,
  dispatchPriority: Int
)

object VirtualAssetConfigParam {

  implicit val virtualAssetConfigParamReads: Reads[VirtualAssetConfigParam] = (
    (JsPath \ "id").read[Long] and
      (JsPath \ "power_min").read[Double] and
      (JsPath \ "power_max").read[Double] and
      (JsPath \ "dispatch_priority").read[Int]
    )(VirtualAssetConfigParam.apply _)
}

これは、データベースから取得した JSON です。

[{"id":"1","power_min":"200","power_max":"400","dispatch_priority":"1"},{"id":"2","power_min":"200","power_max":"400","dispatch_priority":"2"},{"id":"3","power_min":"-700","power_max":"0","dispatch_priority":"3"}]

次のように検証しようとしたとき (ここで、virtualAssetConfigParam はデータベースから取得した文字列です):

Json.parse(virtualAssetConfigParam).validate[List[VirtualAssetConfigParam]]

検証結果として次の結果が得られます。

JsError(
    List(
        ((0)/dispatchPriority,List(ValidationError(List(error.path.missing),WrappedArray()))), 
        ((0)/pMin,List(ValidationError(List(error.path.missing),WrappedArray()))), 
        ((0)/pMax,List(ValidationError(List(error.path.missing),WrappedArray()))), 
        ((0)/id,List(ValidationError(List(error.expected.jsnumber),WrappedArray()))), 
        ((1)/dispatchPriority,List(ValidationError(List(error.path.missing),WrappedArray()))), 
        ((1)/pMin,List(ValidationError(List(error.path.missing),WrappedArray()))), 
        ((1)/pMax,List(ValidationError(List(error.path.missing),WrappedArray()))), 
        ((1)/id,List(ValidationError(List(error.expected.jsnumber),WrappedArray()))), 
        ((2)/dispatchPriority,List(ValidationError(List(error.path.missing),WrappedArray()))), 
        ((2)/pMin,List(ValidationError(List(error.path.missing),WrappedArray()))), 
        ((2)/pMax,List(ValidationError(List(error.path.missing),WrappedArray()))), 
        ((2)/id,List(ValidationError(List(error.expected.jsnumber),WrappedArray())))
    )
)

何が問題ですか?これが失敗する理由がわかりませんでした。

4

2 に答える 2

0

エラーを見ると、パスを見つけようとしていることがわかります - 、、、dispatchPriorityおよびこれはpMin、で必要なパスとは異なります。これは、コードで示した読み取りの実装がここでは使用されていないことを示しています。pMaxidread

これにより、おそらく暗黙の読み取りをコードのスコープにインポートしていないと思います。

case class VirtualAssetConfigParam(
  id: Long,
  pMin: Double,
  pMax: Double,
  dispatchPriority: Int
)

object VirtualAssetConfigParam {

  implicit val virtualAssetConfigParamReads: Reads[VirtualAssetConfigParam] = (
    (JsPath \ "id").read[Long] and
    (JsPath \ "power_min").read[Double] and
    (JsPath \ "power_max").read[Double] and
    (JsPath \ "dispatch_priority").read[Int]
  )(VirtualAssetConfigParam.apply _)

}

object Demo extends App {

  // I think you are missing this import
  import VirtualAssetConfigParam.virtualAssetConfigParamReads

  val virtualAssetConfigParam = [{"id":"1","power_min":"200","power_max":"400","dispatch_priority":"1"},{"id":"2","power_min":"200","power_max":"400","dispatch_priority":"2"},{"id":"3","power_min":"-700","power_max":"0","dispatch_priority":"3"}]

 // It should work if you have that import
 val jsonValidate = Json.parse(virtualAssetConfigParam).validate[List[VirtualAssetConfigParam]]


}
于 2016-10-05T04:37:06.997 に答える