2015-07-02 23 views
0

我想寫一個JSON閱讀器,用於這樣的Json與不同類型的陣列的Json讀者

{ 
     "headers": [ 
      { 
       "id": "time:monthly", 
       "type": "a" 
      }, 
      { 
       "id": "Value1", 
       "type": "b" 
      }, 
      { 
       "id": "Value2", 
       "type": "b" 
      } 
     ], 
     "rows": [ 
      [ 
       "2013-01", 
       4, 
       5 
      ], 
      [ 
       "2013-02", 
       3, 
       6 
      ] 
     ] 
    } 

我知道(感謝報頭),該行中的元素的第一個元素是一種類型的a,第二個和第三個將是b類型。我的目標是創建一個對象行(List[a],List[b])( 類型a和b的元素數量不同,這就是爲什麼我使用List)。 我的問題是如何解析行或如何讀取具有不同類型的對象和沒有ID的Json數組?

+0

我試過了http://jsonlint.com上的JSON,它似乎無效。你能修好它嗎?謝謝。 – facundofarias

+1

你到目前爲止嘗試過什麼? – Garry

+0

您的json字符串的'rows'部分不是有效的json。 –

回答

0

我會試圖設置案例類的模型,並混合播放框架宏基本JSON閱讀器與自定義之一像這樣的行。

import play.api.libs.json._ 

    case class Header(id: String, `type`: String) 
    case class Row(a: String, b: Int, c: Int) 
    case class Data(headers: Seq[Header], rows: Seq[Row]) 

    object RowReads extends Reads[Row] { 
     def reads(js: JsValue) = js match { 
     case JsArray(Seq(a,b,c)) => 
      (a,b,c) match { 
      case (a: JsString, b: JsNumber, c: JsNumber) => 
       JsSuccess(Row(a.value,b.value.toInt,c.value.toInt)) 
      case _ => JsError("nope") 
      } 
      case _ => JsError("nope") 
     } 
    } 

    object Formats { 
     implicit val headerReads = Json.reads[Header] 
     implicit val rowReads = RowReads 
     implicit val dataReads = Json.reads[Data] 

     def readIt(js: JsValue) = { 
     Json.fromJson[Data](js: JsValue) 
     } 
    } 

欲瞭解更多詳情。 https://playframework.com/documentation/2.4.x/ScalaJson