Scala映射Json和case类

Scala映射Json和case类,json,scala,Json,Scala,现在我试图将json解析为case类,但我遇到了一个问题。 这是我的json字符串: {"book_id":"1", "book_name":"Skype", "author_name":"bla bla", "author_country":"Poland"} 我有两个案例课: case class Book(bookId: String, bookName: String){} case class Author(authorNam: String, authorCountry: Stri

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

{"book_id":"1", "book_name":"Skype", "author_name":"bla bla", "author_country":"Poland"}
我有两个案例课:

case class Book(bookId: String, bookName: String){}
case class Author(authorNam: String, authorCountry: String){}
那么如何将Json解析为两个类呢? 输出将是:

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

非常感谢你的帮助

那么,您可以创建另一个类来获取完整的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类,嵌套case类,这样您的响应中就有了这两个类


希望能有帮助。干杯

那么,您可以创建另一个类来获取完整的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类,嵌套case类,这样您的响应中就有了这两个类


希望能有帮助。干杯

有几种解决方案,其中最明显的是:

  • (它支持杰克逊)

  • 是Scala中轻量级、干净且高效的JSON实现

  • <强> uPD>强>让我们考虑JSO4S:

    的用法
      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)))
    }
    

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

  • (它支持杰克逊)

  • 是Scala中轻量级、干净且高效的JSON实现

  • <强> uPD>强>让我们考虑JSO4S:

    的用法
      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)))
    }
    

    答案如下:

    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。以下是答案:

    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。

    谢谢,但我很抱歉,因为此示例不完全是case类Book和Author的总属性超过22个字段,因此我们无法使用所有属性创建新的case类。我的重点是如何将“book_id”映射到“bookId”好吧,在你的问题中,问题似乎是解析到两个不同的类。。。您可以始终使用框架进行序列化。它将给定字段映射到所需的变量。您可以使用的框架是json4s:是的,谢谢。我检查了json4s,但我仍然不知道如何将“book_id”映射到“bookId”,您能解释更多吗,或者您能给我一个例子吗?谢谢,但我很抱歉,因为这个例子不准确,案例类book和Author的总属性超过22个字段,所以我们无法创建具有所有属性的新案例类。我的重点是如何将“book_id”映射到“bookId”好吧,在你的问题中,问题似乎是解析到两个不同的类。。。您可以始终使用框架进行序列化。它将给定字段映射到所需的变量。您可以使用的框架是json4s:是的,谢谢。我检查了json4s,但我仍然不明白如何将“book_id”映射到“bookId”,你能解释更多或者给我一个例子吗?是的,但我的黄金是映射“book_id”和“bookId”。检查我的答案,(upd部分),`(“lotto id”->lotto.id)`与你的示例类似。我检查了,你的答案是呈现Json,我需要从Json解析到case类。这个例子解决了
    “book\u id”和“bookId”
    的问题,只需使用解析而不是渲染。我的答案是由
    Json4s
    指定的DSL。当然,你可以在github上找到与你的Json4s的om主页类似的例子——我提供的第一个链接。是的,但我的黄金是映射“book_id”和“bookId”。检查我的答案(upd部分),`(“lotto id”->lotto.id)`与你的例子类似。我检查了,你的答案是呈现Json,我需要从Json解析到case类。这个例子解决了
    “book\u id”和“bookId”
    的问题,只需使用解析而不是渲染。我的答案是由
    Json4s
    指定的DSL。当然,您可以在github上找到类似于您的示例om主页的Json4s——我提供的第一个链接。