Scala映射Json和case类

时间:2016-10-28 14:37:37

标签: json scala

现在我试图将json解析为case class,我遇到了问题。 这是我的json字符串:

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

我有2个案例类:

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

那么如何将Json解析为2个类呢? 输出将是:

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

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:2)

这就是答案:

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。

答案 1 :(得分:1)

有一些解决方案适合您,其中最明显的是:

  1. Json4s(它支持杰克逊)

  2. Spray-Json是Scala中的一个轻量级,干净且高效的JSON实现。

  3. 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)))
    }
    

答案 2 :(得分:-1)

好吧,你可以创建另一个类来获取完整的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)

其他方法是将Response作为其他类的case类,嵌套case类,这样你的Response中就会有这两个类。

希望它有所帮助。干杯!