2015-06-23 62 views
2

我必須解構以下JSON到外殼類的列表:用JSON4s解構JSON數組的最優雅方式是什麼?

{ 
    "data": [ 
    [49, true, 14, null, null], 
    [52, false, null, null, null], 
    [72, true, 4, 2, 1] 
    ] 
} 

案例類:

case class Data(i1: Int, b: Bool, i2: Option[Int], i3: Option[Int], i4: Option[Int]) 

我開始用一種理解,但無法完成它:

for { 
    JArray(data) <- json \ "data" 
    JArray(d) <- data 
    JInt(line) <- d.head // ??? 
} yield Data() 

任何幫助,非常感謝。

感謝,

邁克爾

回答

2

你可以寫一個CustomSerializerData

我引入了一個JOptionInt提取器將JIntJNull轉換爲Option[Int],它可以直接在json4s中完成。

import org.json4s._ 
import org.json4s.jackson.JsonMethods._ 
import org.json4s.JsonDSL._ 

case class Data(i1: Int, b: Boolean, i2: Option[Int], i3: Option[Int], i4: Option[Int]) 

object DataSerializer extends CustomSerializer[Data](format => ( 
    { 
    case JArray(List(JInt(i1), JBool(b), JOptionInt(i2), JOptionInt(i3), JOptionInt(i4))) => 
     Data(i1.toInt, b, i2, i3 , i4) 
    }, { 
    case d: Data => JArray(List(d.i1, d.b, d.i2, d.i3, d.i4)) 
    } 
)) 

object JOptionInt { 
    def unapply(x: JValue) : Option[Option[Int]] = x match { 
    case JInt(i) => Option(Option(i.toInt)) 
    case JNull => Option(None) 
    case _  => None 
    } 
} 

哪些可以作爲:

implicit val formats = DataSerializer 

val json = parse(""" 
     { 
     "data": [ 
      [49, true, 14, null, null], 
      [52, false, null, null, null], 
      [72, true, 4, 2, 1] 
     ] 
     } 
     """) 

val result = (json \ "data").extract[Array[Data]] 
// Array(Data(49,true,Some(14),None,None), Data(52,false,None,None,None), Data(72,true,Some(4),Some(2),Some(1))) 
+0

謝謝,這樣做的工作! –

4

如果你能允許包括狂喜JSON庫,這可以如下,依然採用了JSON4S後臺完成。這需要以下進口:

import rapture.json._, jsonBackends.json4s._ 

如果你已經有了JSON爲JValue,你可以將其轉換爲狂喜的Json類型如下:

val json = Json(jValue) 

鑑於你的情況的類定義,你需要重新定義JSON提取器,用於Data類型(已經有一個希望將JSON對象默認提取器),如下所示:

implicit val dataExtractor = Json.extractor[Json].map { j => 
    Data(j(0).as[Int], j(1).as[Boolean], j(2).as[Option[Int]], 
     j(3).as[Option[Int]], j(4).as[Option[Int]]) 
} 

,然後你可以提取它:

val list = json.as[List[Data]] 
+0

謝謝,但我寧願使用json4s僅此。 –

相關問題