2016-03-08 24 views
0

在Scala中,我想解析使用Travis CI REST API檢索的JSON響應。爲此,我決定使用play-json庫。伴隨着這一點,並根據對REST API「模式」,我已經定義了以下情況下類:Scala play-json-不解析/反序列化爲單個參數的case類

case class Build(id : Int, 
      repository_id : Int, 
      commit_id : Int, 
      number : String, 
      event_type : String, 
      pull_request : Boolean, 
      pull_request_title : String, 
      pull_request_number : String, 
      state : String, 
      started_at : String, 
      finished_at : String, 
      duration : Int, 
      job_ids : List[Int]) extends Serializable{ 
} 

case class Builds(builds : List[Build]) 

實現應該是不言自明的本身,而是需要進行任何進一步的描述,我會更新這個問題。

伴隨着這一點,我已經定義了以下讀取的播放JSON庫:

implicit val buildReads : Reads[Build] = (
     (JsPath \ "id").read[Int] and 
     (JsPath \ "repository_id").read[Int] and 
     (JsPath \ "commit_id").read[Int] and 
     (JsPath \ "number").read[String] and 
     (JsPath \ "event_type").read[String] and 
     (JsPath \ "pull_request").read[Boolean] and 
     (JsPath \ "pull_request_title").read[String] and 
     (JsPath \ "pull_request_number").read[String] and 
     (JsPath \ "state").read[String] and 
     (JsPath \ "started_at").read[String] and 
     (JsPath \ "finished_at").read[String] and 
     (JsPath \ "duration").read[Int] and 
     (JsPath \ "job_ids").read[List[Int]] 
    )(Build.apply _) 

implicit val buildsReads : Reads[Builds] = (__ \ "builds").read[List[Build]].map(Builds(_)) 

代碼然而確實編譯,架構即case類不確認的REST API響應,在驗證響應時,出現以下錯誤:

JsError(List((/ builds(0)/ pull_request_title,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ build(0)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/builds(1)/pull_request_title,List(ValidationError(List(error.expected.jsstring),Wrap (/)//builds(1)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(2)/ pull_request_title,List(ValidationError(List (/ builds(2)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(3) /()/ pull_request_title,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(3)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray())) ),(/ builds(4)/ pull_request_title,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/builds(4)/pull_request_number,List(ValidationError(List(error.expected。 (),//builds(5)/ pull_request_number,List(jsstring),WrappedArray()))),(/ builds(5)/ pull_request_title,List(ValidationError(List(error.expected.jsstring),WrappedArray()))) ValidationError(List(error.expected.jsstring),WrappedArray()))),(/builds(6)/pull_request_number,List(ValidationError(List(error.expected) (/)/ builds(7)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(7)/ pull_request_number,List (ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(8)/ pull_request_title,List(ValidationError(List(error.expected.jsstring),WrappedArray()))), build(8)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/builds(9)/pull_request_title,List(ValidationError(List(error.expected.jsstring),WrappedArray ())),(/ builds(9)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(10)/ pull_request_title,List(ValidationError(List ()/ builds(11)/ error_expected.jsstring),WrappedArray())),(/ builds(10)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))) pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(12)/ pull_request_title,List(ValidationError List(error.expected.jsstring),WrappedArray()))),(/ builds(12)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(13 )/ pull_request_title,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(13)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()) )),(/ builds(14)/ pull_request_title,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/builds(14)/pull_request_number,List(ValidationError(List(error.expected) (/),/ builds(15)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(15)/ pull_request_number,List (ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(16)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))), builds(17)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(18)/ pull_request_t itle,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(18)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))) ,(/builds(19)/pull_request_title,List(ValidationError(List(error.expected。()/),//builds(20)/ pull_request_title,List(()),(/ builds(19)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))) ValidationError(列表(error.expected.jsstring),WrappedArray()))),(/構建(20)/ pull_request_number,列表(ValidationError(列表(error.expected.jsstring),WrappedArray()))),(/構建(21)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(22)/ pull_request_title,List(ValidationError(List(error.expected.jsstring),WrappedArray )))),(/構建(22)/ pull_request_number,列表(ValidationError(列表(error.expected.jsstring),WrappedArray()))),(/構建(23)/ pull_request_title,列表(ValidationError(列表(錯誤(/)/ builds(24)/ pull_request_title().expected.jsstring),WrappedArray()))),(/ builds(23)/ pull_request_number,List(ValidationError(List(error.expected.jsstring),WrappedArray()))) ,List(ValidationError(List(error.expected.jsstring),WrappedArray()))),(/ builds(24)/ pull_request_number,List(Validation錯誤(List(error.expected.jsstring),WrappedArray())))))

任何線索到問題可能是什麼?提前致謝!

+1

你能否提供觸發錯誤的示例JSON(最好小於觸發上述錯誤的東西,因爲它看起來像一個巨大的數組)。 –

+0

@米-Z已解決的問題 - 問題是,pull_request領域:Boolean指示構建是否通過拉請求或沒有作出 - 這意味着pull_request_title和pull_request_number可以有NULL值。此修復程序是做到以下幾點:(JsPath \「pull_request_title」)讀[字符串] .orElse(Reads.pure(空)) – dsafa

+0

我會建議使用'選項[字符串]'而不是'null',那麼你可以使用'readNullable'。 –

回答

2

一起玩的Json,如果你不需要手工編寫你的讀者或作家,你打算序列化不使用任何自定義類型的情況下類,你可以使用Json.Writes [T]:

implicit val buildFormat = Json.Reads[Build] 

這會自動爲您生成Reads(您也可以使用Json.Writes [T]或Json.Format [T])。 Play足夠聰明,能夠使用它來反序列化List [T]。