2016-10-28 135 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这一点。