2016-10-04 47 views
0

我有以下的情況下類:播放JSON讀取錯誤當讀取一個序列

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]] 

我碰到下面的驗證RESU lt:

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

什麼問題?我看不出爲什麼這會失敗!

+0

'Json.parse'用於將Json-string解析爲PlayJson的JsValue表示。如果你已經有了JsValue ...你不需要解析它,也不能解析它。 –

+0

好的!對困惑感到抱歉。從數據庫讀取JSON作爲字符串,然後使用Json.parse(...) – sparkr

+0

將其解析爲JsValue。如果這是一個簡單的字符串,那麼可以使用Json.toJson(「string」) –

回答

0

JSON中的數據類型與案例類中的預期數據類型不匹配。所以,案例類應爲:

implicit val virtualAssetConfigParamReads: Reads[VirtualAssetConfigParam] = new Reads[VirtualAssetConfigParam] { 
    override def reads(json: JsValue): JsResult[VirtualAssetConfigParam] = { 
     JsSuccess(VirtualAssetConfigParam(
     (json \ "id").as[String].toLong, 
     (json \ "power_min").as[String].toDouble, 
     (json \ "power_max").as[String].toDouble, 
     (json \ "dispatch_priority").as[String].toInt 
    )) 
    } 
    } 

當我現在請JSON解析功能,我不喜歡這樣寫道:

Try((Json.parse(json)).validate[Seq[VirtualAssetConfigParam]]) 

,然後折上的嘗試成功了!

0

看一看我的博客張貼在不久前,它可以幫助你:

http://pedrorijo.com/blog/scala-json/

http://pedrorijo.com/blog/scala-json-part2/

+0

這不利於!也請不要發佈鏈接,因爲它們可能在一段時間後不存在! – sparkr

+0

雖然你可以使用其中的一種選擇。你有沒有試過在sbt控制檯上測試它?創建一個json對象(不是數組)並嘗試解析。只是爲了確定錯誤是解析對象還是解析列表 – pedrorijo91

+0

解析單個案例類的方法很有效,但問題只有當它是一個數組時! – sparkr

0

如果你看一下你的錯誤,你會發現,它正試圖找到路徑 - dispatchPriority,pMin,pMaxid這是不同於你想要在你的01路徑。這表示您在代碼中顯示的讀取實現未在此處使用。

這讓我想到,可能你並沒有將你的隱式讀入導入你的代碼範圍。

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]] 


} 
+0

您是否嘗試運行您發佈的代碼?我知道我必須導入隱式的val。如果不是,我將如何能夠首先編譯它?您的Demo對象在運行時會失敗,因爲您可以看到Json中的數據類型不匹配。例如,power_min是Json中的String,但case類嘗試將其讀爲Double,並且失敗。所以嘗試運行它,然後發佈你的結果。我找到了我在這裏發佈的解決方案! – sparkr