2014-03-31 69 views
2

未定義/ null元素讀取給出下面的JSON數組:播放框架2.2.2斯卡拉JSON與導致NoSuchElementException異常

{ 
    "success": true, 
    "data": [ 
     { 
      "id": 600, 
      "stage_id": 15, 
      "title": "test deal", 
      "value": 0, 
      "currency": "EUR", 
      "rotten_time": "2014-03-18 17:45:51", 
     }, 
     { 
      "id": 601, 
      "stage_id": 15, 
      "title": "test deal2 deal", 
      "value": 0, 
      "currency": "EUR", 
      "rotten_time": "2014-03-24 14:11:00" 
     }, 
     { 
      "id": 602, 
      "stage_id": 15, 
      "title": "test deal2 deal", 
      "value": 0, 
      "currency": "EUR", 
      "rotten_time": null 
     } 
    ], 
    "additional_data": { 
     "pagination": { 
      "start": 0, 
      "limit": 100, 
      "more_items_in_collection": false 
     } 
    } 
} 

使用讀取方法來實例化對象,如下面

case class Deal(id: Long, stage_id: Long, status: String, rotten_time: Date) 

implicit val dealReader = Json.reads[Deal] 

val futureJson: Future[List[Deal]] = futureResponse.map(
    response => (response.json \ "data").validate[List[Deal]].get 
) 

我得到一個NoSuchElementsException當一個元素的值爲null時(類似於rotten_time)

我想要這樣的東西

> println(deals.toString) 
> Deal(601,15,open,Mon Mar 18 17:45:51 CET 2014) 
> Deal(602,15,open,Mon Mar 18 14:11:00 CET 2014) 
> Deal(603,15,open,null) 

即使字段值爲NULL,是否有確保對象實例化的方法?我沒有理由爲什麼每個現有的字段都必須分配一個值。

我發現相關的問題herehere但他們沒有幫我解決我的問題。

回答

1

我自己找到了答案。我是斯卡拉新手,所以對我來說不是很明顯。將字段類型更改爲選項[日期]解決了問題。

case class Deal(id: Long, stage_id: Long, status: String, rotten_time: Option[Date]) 

所以結果是

> println(deals.toString) 
> Deal(601,15,open,Some(Mon Mar 18 17:45:51 CET 2014)) 
> Deal(602,15,open,Some(Mon Mar 18 14:11:00 CET 2014)) 
> Deal(603,15,open,None) 

爲選項[]據說是一個辦法解決NullPointerException秒,但不NoSuchElementException s這個有點出乎意料。