spark 儲存json資料遇到問題——json4s使用(一)

0day__發表於2017-01-07

spark 儲存json資料遇到問題——json4s使用(一)

在進行spark的學習過程中遇到了這樣的問題。
1、《O'REILLY Learning Spark》的書中說道能夠使用spark進行json 的讀寫,但是給出的例子使用的json轉換的jar包是jackson的,還需要再次進行引入。
2、能不能找到一個spark內部已經有的基於scala的json處理的jar包。

在檢視spark依賴的jar檔案時,找到了json4s這個jar包,很明顯就是使用scala的一個json轉換的jar包。下面就介紹一下如何使用,首先介紹的是如何通過json4s實現生成json,後面還會介紹如何通過json串轉換成物件。

好,下面上貨,主要參考的是json4s的官方文件,這是地址:https://github.com/json4s/json4s/。
import org.json4s._
  import org.json4s.JsonDSL._
  import org.json4s.jackson.JsonMethods._
  
  object JsonStudy {
    def main(args: Array[String]): Unit = {
      val a = parse(""" { "numbers" : [1, 2, 3, 4] } """)
      println(a.toString)
      val b = parse("""{"name":"Toy","price":35.35}""", useBigDecimalForDouble = true)
      println(b.toString)
  
      val c = List(1, 2, 3)
      val d = compact(render(c))
      println(d)
      val e = ("name" -> "joe")
      val f = compact((render(e)))
      println(f)
      val g = ("name" -> "joe") ~ ("age" -> 35)
      val h = compact(render(g))
      println(h)
      val i = ("name" -> "joe") ~ ("age" -> Some(35))
      val j = compact(render(i))
      println(j)
      val k = ("name" -> "joe") ~ ("age" -> (None: Option[Int]))
      val l = compact(render(k))
      println(l)
  
      //定義json
      println("===========================")
      //推薦這種方式,因為可以用在使用map
      val jsonobj = (
        ("name" -> "xiaoming") ~
          ("age" -> 12)
        )
      println(jsonobj)
      println(compact(render(jsonobj)))
  
      val jsonobjp = parse(
        """{
            "name":"xiaogang",
            "age":12
          }""")
      println(jsonobjp)
      println(compact(render(jsonobjp)))
  
      //通過類生成json
      println("===========================")
      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)))
    }
  }

執行結果:


這裡轉換的過程已經很清楚了,不再做過多的贅述。

相關文章