2016-10-28 3 views
-2

теперь я пытаюсь разобрать класс json для case, и у меня есть проблема. Это моя строка JSON:Scala mapping Json и класс case

{"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) 

Большое вам спасибо за вашу помощь.

ответ

0

Ну, вы могли бы создать еще один класс, чтобы получить полный JSon, как класс ответа:

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

Вы карту своего ответа, что я предполагая, приходят от сервера или другой службы, а затем из этого вы разделяете свои два других класса, отображая их.

Чем лучше вы можете в этих случаях получить весь отклик, который вы будете использовать в своем прецеденте или в вашем коде в целом, а затем обрабатывать данные в своем коде, перед отображением или использованием полученных данных ,

EDIT: чтобы отобразить ответ, используя ваш пример, вы будете иметь

Response(1, Skype, bla bla, Poland) 

тогда вы могли бы сделать что-то вроде

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

Другого подхода с вашим ответом является случай классом другие классы, вложенные классы case, поэтому у вас будут оба класса внутри вашего ответа.

Надеюсь, это поможет. Ура!

+0

Спасибо, но я извиняюсь, потому что этот пример не совсем, общие свойства корпуса класса Book и автор более 22 полей , поэтому мы не можем создать новый класс case со всеми свойствами. И мое золото - это сопоставление «book_id» с «bookId» –

+0

. В вашем вопросе казалось, что проблема заключалась в анализе на два разных класса ... вы всегда можете использовать фреймворки для сериализации. он отображает заданное поле в нужную вам переменную. Рамкой, которую вы можете использовать, является json4s: https://github.com/json4s/json4s – Pstr

+0

Да, спасибо. Я проверил json4s, но я до сих пор не понимаю, как сопоставить «book_id» с «bookId», можете ли вы объяснить больше или можете привести мне пример? –

1

Есть несколько решений для Вас, наиболее очевидных из них:

  1. Json4s (он поддерживает) Джексон

  2. Spray-Json представляет собой легкая, чистая и эффективная реализация JSON в Scala.

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 мой ответ, (раздел обновления), '(« lotto-id »-> lotto.id)' аналогичен вашему примеру. –

+0

Я проверил, и ваш ответ отображается в Json, мне нужно разобрать Json на класс case. –

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 для этого.

Смежные вопросы