使用spray json的一點小經(jīng)驗

一個scala常用的json工具

java里面的fastjson,gson,和Jackson是我最熟悉的json序列化框架颤专,用起來沒什么問題,接觸了scala之后喂窟,我看到很多項目使用sprayjson,尤其是akka相關(guān)的項目毅人,使用特別多铣耘,因為剛接觸scala肋殴,它的伴生對象和implicit隱式語義會讓新手使用spray json的時候,有一點點困惑坦弟。

json序列化的流程

簡單說就是json字符串和對象的互轉(zhuǎn)护锤,java里面的對象一般是指bean,有的也叫pojo酿傍,scala里面一般指case class的對象烙懦。
還有很多框架不提供到bean的轉(zhuǎn)換,而是直接轉(zhuǎn)成JsonObject和JsonArray對象赤炒,有的同時支持氯析,比如fastJson,spray json 同樣也都支持莺褒,基礎(chǔ)類叫做JsonValue掩缓,具體的還有JSNumber、JSString遵岩、JSBoolean等更詳細的數(shù)據(jù)類型你辣,原理其實跟其它java的json框架沒有太大的區(qū)別

image.png

具體用的時候巡通,spray json是這樣的:導(dǎo)入import spray.json._

一個json串舍哄,調(diào)用parseJson方法
一個scala對象調(diào)用toJson方法

都可以轉(zhuǎn)化為一個spray json的語法樹對象

這個語法樹對象可以打印成json字符串宴凉,也可以轉(zhuǎn)化為一個scala對象
轉(zhuǎn)為json字符串:
prettyPrint // or .compactPrint
轉(zhuǎn)為對象val myObject = jsonAst.convertTo[MyObjectType]

https://github.com/spray/spray-json
具體的參考這個文檔即可
調(diào)用方式都是死的,無非是convertTo表悬,parseJson弥锄,toJson,但是具體怎么轉(zhuǎn)蟆沫,是需要協(xié)議的籽暇,框架本身內(nèi)置了一大堆協(xié)議,用于scala基礎(chǔ)對象類型的轉(zhuǎn)化饥追,而我們自定義的case class或者class需要我們自己實現(xiàn)轉(zhuǎn)化的方式图仓,這個是我們需要編碼的地方。

兩種比較常用的方式

1但绕、JsonProtocol

對于沒有顯示聲明伴生對象的情況救崔,sprayjson給你準(zhǔn)備了很多 jsonFormatX,x對應(yīng)你的case class參數(shù)個數(shù)捏顺,比如

case class Color(name: String, red: Int, green: Int, blue: Int)

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit val colorFormat = jsonFormat4(Color)
}

如果有22個參數(shù)六孵,那就是jsonFormat22,這些框架提供的jsonFormatX使用的話幅骄,需要導(dǎo)入spray.json.DefaultJsonProtocol_,這也是scala隱式的特點
如果顯示聲明了伴生對象劫窒,那么就不能直接jsonFormat4(Color)這樣寫了,上面這個例子里拆座,如果聲明了Color伴生對象主巍,那么jsonFormat4(Color)里的Color會被理解成Color對象,這時候需要我們提供伴生對象的apply方法挪凑,要寫成這樣

case class Color(name: String, red: Int, green: Int, blue: Int)
object Color

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit val colorFormat = jsonFormat4(Color.apply)
}
2孕索、普通 class的序列化

普通class即非case class的情況,多數(shù)用到RootJsonFormat躏碳,這時候需要我們重寫read,write方法搞旭,即JSValue和class對象的轉(zhuǎn)換關(guān)系
例如:

class Color(val name: String, val red: Int, val green: Int, val blue: Int)

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit object ColorJsonFormat extends RootJsonFormat[Color] {
    def write(c: Color) =
      JsArray(JsString(c.name), JsNumber(c.red), JsNumber(c.green), JsNumber(c.blue))

    def read(value: JsValue) = value match {
      case JsArray(Vector(JsString(name), JsNumber(red), JsNumber(green), JsNumber(blue))) =>
        new Color(name, red.toInt, green.toInt, blue.toInt)
      case _ => deserializationError("Color expected")
    }
  }
}

import MyJsonProtocol._

val json = new Color("CadetBlue", 95, 158, 160).toJson
val color = json.convertTo[Color]

更復(fù)雜的用法,后面陸續(xù)補充

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菇绵,一起剝皮案震驚了整個濱河市肄渗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咬最,老刑警劉巖翎嫡,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異永乌,居然都是意外死亡钝的,警方通過查閱死者的電腦和手機翁垂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硝桩,“玉大人沿猜,你說我怎么就攤上這事⊥爰梗” “怎么了啼肩?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長衙伶。 經(jīng)常有香客問我祈坠,道長,這世上最難降的妖魔是什么矢劲? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任赦拘,我火速辦了婚禮,結(jié)果婚禮上芬沉,老公的妹妹穿的比我還像新娘躺同。我一直安慰自己,他們只是感情好丸逸,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布蹋艺。 她就那樣靜靜地躺著,像睡著了一般黄刚。 火紅的嫁衣襯著肌膚如雪捎谨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天憔维,我揣著相機與錄音涛救,去河邊找鬼。 笑死业扒,一個胖子當(dāng)著我的面吹牛检吆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凶赁,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼咧栗,長吁一口氣:“原來是場噩夢啊……” “哼逆甜!你這毒婦竟也來了虱肄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤交煞,失蹤者是張志新(化名)和其女友劉穎咏窿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體素征,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡集嵌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年萝挤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片根欧。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡怜珍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凤粗,到底是詐尸還是另有隱情酥泛,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布嫌拣,位于F島的核電站柔袁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏异逐。R本人自食惡果不足惜捶索,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灰瞻。 院中可真熱鬧腥例,春花似錦、人聲如沸箩祥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袍祖。三九已至底瓣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蕉陋,已是汗流浹背捐凭。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凳鬓,地道東北人茁肠。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像缩举,于是被迫代替她去往敵國和親垦梆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355