Json4s

在寫spark項目時遇到scala對象與json對象之間轉(zhuǎn)換的問題焰盗,花點時間總結(jié)一下蝎毡。

Json4s介紹

Json4s下面有兩個類型的包

  • Lift Json
import org.json4s._
import org.json4s.native.JsonMethods._

native package具有l(wèi)ift-json的所有功能。

  • Jackson
import org.json4s._
import org.josn4s.jackson.JsonMethods._

與native package不同的是壶熏,jackson包含了大部分jackson-module-scala的功能,也可以使用lift-json下的所有功能。在這個項目中我們使用jackson翰意。

Json AST

lift-json library 的核心就是Json AST,它將Json對象轉(zhuǎn)換成了語法樹。

sealed abstract class JValue
case object JNothing extends JValue // 'zero' for JValue
case object JNull extends JValue
case class JString(s: String) extends JValue
case class JDouble(num: Double) extends JValue
case class JDecimal(num: BigDecimal) extends JValue
case class JInt(num: BigInt) extends JValue
case class JBool(value: Boolean) extends JValue
case class JObject(obj: List[JField]) extends JValue
case class JArray(arr: List[JValue]) extends JValue

type JField = (String, JValue)

轉(zhuǎn)換的常見方式有:

  • Json DSL(implicit)
  • String parse
  • case class

下面一一介紹冀偶。

Json4s安裝

  • SBT users
  • native support
val json4sNative = "org.json4s" %% "json4s-native" % "{latestVersion}"
  • jackson support
val json4sJackson = "org.json4s" %% "json4s-jackson" % "{latestVersion}"
  • Maven users
  • native support
<dependency>
  <groupId>org.json4s</groupId>
  <artifactId>json4s-native_${scala.version}</artifactId>
  <version>{latestVersion}</version>
</dependency>
  • jackson support
<dependency>
  <groupId>org.json4s</groupId>
  <artifactId>json4s-jackson_${scala.version}</artifactId>
  <version>{latestVersion}</version>
</dependency>

JSON轉(zhuǎn)換

這里我們都以jackson為例醒第,native support請參考http://json4s.org/
一個有效的json對象可以轉(zhuǎn)換成AST格式

String parse
import org.json4s._
import org.json4s.jackson.JsonMethods._
parse("""{ "numbers" : [1, 2, 3, 4] }""")
parse("""{"name":"Toy","price":35.35}""", useBigDecimalForDouble = true)
DSL Parse

任意scala原始對象與json原始對象之間的轉(zhuǎn)換

#List to json
scala> val json = List(1, 2, 3)
scala> compact(render(json))
res0: String = [1,2,3]
#Map to json
scala> val json = ("name" -> "joe")
scala> compact(render(json))
res1: String = {"name":"joe"}
#當有多行數(shù)據(jù)時,用~符號連接
scala> val json = ("name" -> "joe") ~ ("age" -> 35)
scala> compact(render(json))
res2: String = {"name":"joe","age":35}
case class

當你有自定義的數(shù)據(jù)類型想進行轉(zhuǎn)換時进鸠,可以使用下面的方法

type DslConversion = T => JValue
object JsonExample extends App {
  import org.json4s._
  import org.json4s.JsonDSL._
  import org.json4s.jackson.JsonMethods._
  
  #定義類 Winner, Lotto
  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)
  
  #轉(zhuǎn)換json
  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> JsonExample
{"lotto":{"lotto-id":5,"winning-numbers":[2,45,34,23,7,5,3],"winners":
[{"winner-id":23,"numbers":[2,45,34,23,3,5]},{"winner-id":54,"numbers":[52,3,12,11,18,22]}]}}

如果想將結(jié)果打印出來稠曼,可以使用

scala> pretty(render(JsonExample.json))

{
  "lotto":{
    "lotto-id":5,
    "winning-numbers":[2,45,34,23,7,5,3],
    "winners":[{
      "winner-id":23,
      "numbers":[2,45,34,23,3,5]
    },{
      "winner-id":54,
      "numbers":[52,3,12,11,18,22]
    }]
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市客年,隨后出現(xiàn)的幾起案子霞幅,更是在濱河造成了極大的恐慌,老刑警劉巖量瓜,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝗岖,死亡現(xiàn)場離奇詭異,居然都是意外死亡榔至,警方通過查閱死者的電腦和手機抵赢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唧取,“玉大人铅鲤,你說我怎么就攤上這事》愕埽” “怎么了邢享?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淡诗。 經(jīng)常有香客問我骇塘,道長,這世上最難降的妖魔是什么韩容? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任款违,我火速辦了婚禮,結(jié)果婚禮上群凶,老公的妹妹穿的比我還像新娘插爹。我一直安慰自己,他們只是感情好请梢,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布赠尾。 她就那樣靜靜地躺著,像睡著了一般毅弧。 火紅的嫁衣襯著肌膚如雪气嫁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天够坐,我揣著相機與錄音寸宵,去河邊找鬼崖面。 笑死,一個胖子當著我的面吹牛邓馒,可吹牛的內(nèi)容都是我干的嘶朱。 我是一名探鬼主播蛾坯,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼光酣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脉课?” 一聲冷哼從身側(cè)響起救军,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎倘零,沒想到半個月后唱遭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡呈驶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年拷泽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袖瞻。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡司致,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出聋迎,到底是詐尸還是另有隱情脂矫,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布霉晕,位于F島的核電站庭再,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏牺堰。R本人自食惡果不足惜拄轻,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伟葫。 院中可真熱鬧哺眯,春花似錦、人聲如沸扒俯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撼玄。三九已至夺姑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掌猛,已是汗流浹背盏浙。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工眉睹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人废膘。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓竹海,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丐黄。 傳聞我的和親對象是個殘疾皇子斋配,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容