2016-10-28 182 views
-2

現在我試圖解析JSON案例類,我有一個問題。 這是我的JSON字符串:斯卡拉映射Json和案例類

{"book_id":"1", "book_name":"Skype", "author_name":"bla bla", "author_country":"Poland"} 

而且我有2個case類:

case class Book(bookId: String, bookName: String){} 
case class Author(authorNam: String, authorCountry: String){} 

那麼,如何解析JSON分爲2類? 輸出將是:

Book(1, Skype) 
Author(bla bla, Poland) 

非常感謝您的幫助。

回答

0

嗯,你可以創建另一個類,以獲得完整的JSON,作爲響應類:

case class Response(bookId: String, bookName: String, authorNam: String, authorCountry: String){} 

你映射你的迴應,那我假設來自服務器或其他服務,然後從這個你分開你的兩個其他類,映射它們。

在這些情況下,您可以做的越好,就是在顯示或使用接收到的數據之前,獲取您在用例或一般代碼中使用的整個響應,然後處理代碼中的數據。

編輯:映射響應,使用你的榜樣,你就會有

Response(1, Skype, bla bla, Poland) 

,那麼你會做這樣的事情

Book(Response.bookID, Response.bookName) 
Author(Response.authorName, Response.authorCountry) 

另一種方法是讓你的反應是一個案例類的其他類嵌套case類,所以你的Response中將有兩個類。

希望它有幫助。乾杯!

+0

謝謝你,但我很抱歉,因爲這個例子是不完全的,案例類圖書的總性能和作者超過22場,所以我們不能創建具有所有屬性的新案例類。我的黃金是如何將「book_id」映射到「bookId」 –

+0

,在您的問題中,似乎問題是解析爲2個不同的類別......您始終可以使用框架進行序列化。它將給定的字段映射到您想要的變量。您可以使用的框架是json4s:https://github.com/json4s/json4s – Pstr

+0

是的,謝謝。我檢查了json4s,但我仍然不知道如何將「book_id」映射到「bookId」,你能解釋一下還是可以給我一個例子? –

1

有你的幾個解決方案,最明顯的人:

  1. Json4s(它支持傑克遜)

  2. Spray-Json是Scala輕巧,清潔,高效的JSON實現。

UPD讓我們考慮Json4s的用法:

object JsonExample extends App { 

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

    case class Winner(id: Long, numbers: List[Int]) 
    case class Lotto(id: Long, winningNumbers: List[Int], winners: List[Winner], drawDate: Option[java.util.Date]) 

    val winners = List(Winner(23, List(2, 45, 34, 23, 3, 5)), Winner(54, List(52, 3, 12, 11, 18, 22))) 
    val lotto = Lotto(5, List(2, 45, 34, 23, 7, 5, 3), winners, None) 

    val json = 
    ("lotto" -> 
     ("lotto-id" -> lotto.id) ~ 
     ("winning-numbers" -> lotto.winningNumbers) ~ 
     ("draw-date" -> lotto.drawDate.map(_.toString)) ~ 
     ("winners" -> 
     lotto.winners.map { w => 
      (("winner-id" -> w.id) ~ 
      ("numbers" -> w.numbers))})) 

    println(compact(render(json))) 
} 
+0

是的,但是我的黃金正在映射「book_id」和「bookId」。 –

+0

Chech我的回答,(upd部分),'(「lotto-id」 - > lotto.id)'與您的示例類似。 –

+0

我檢查了,你的答案是渲染Json,我需要從Json解析到案例類。 –

1

這就是答案:

object JsonExample extends App { 

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

    implicit val formats = DefaultFormats // Brings in default date formats etc. 

    case class Book(bookId: String, bookName: String) {} 
    case class Author(authorName: String, authorCountry: String) {} 

    val jsonString = """{"book_id":"1", "book_name":"Skype", "author_name":"bla bla", "author_country":"Poland"}""" 
    val json = parse(jsonString) 
    println(json.camelizeKeys.extract[Book]) 
    println(json.camelizeKeys.extract[Author]) 
} 

感謝@rukavitsya這一點。