在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())))))
任何線索到問題可能是什麼?提前致謝!
你能否提供觸發錯誤的示例JSON(最好小於觸發上述錯誤的東西,因爲它看起來像一個巨大的數組)。 –
@米-Z已解決的問題 - 問題是,pull_request領域:Boolean指示構建是否通過拉請求或沒有作出 - 這意味着pull_request_title和pull_request_number可以有NULL值。此修復程序是做到以下幾點:(JsPath \「pull_request_title」)讀[字符串] .orElse(Reads.pure(空)) – dsafa
我會建議使用'選項[字符串]'而不是'null',那麼你可以使用'readNullable'。 –