golang操作json

Encode

golang和json的類型對應(yīng)關(guān)系如下:

  • bool類型 -- JSON的Boolean
  • 整數(shù),浮點(diǎn)數(shù)等數(shù)值類型 -- JSON的Number
  • string -- JSON的字符串(帶""引號)
  • struct -- JSON的Object (再根據(jù)各個(gè)成員的類型遞歸打包)
  • 數(shù)組或切片 -- JSON的Array
  • []byte -- 會(huì)先進(jìn)行base64編碼然后轉(zhuǎn)換為JSON字符串
  • map -- JSON的Object冰肴。key必須是string
  • interface{} -- 按照內(nèi)部的實(shí)際類型進(jìn)行轉(zhuǎn)換
  • nil -- JSON的null
  • channel,func等類型 -- 返回UnsupportedTypeError

在golang中黔宛,encoding/json包下函數(shù)Marshal可以將結(jié)構(gòu)體編碼為json格式

func Marshal(in interface{}) (out []byte, err error)

type Student struct {
    Name string
    Age  int
    Sex  string
}

func main() {
    var stu = Student{"dtc", 22, "boy"}
    //將結(jié)構(gòu)體封裝成json格式,并返回[]byte
    j, err := json.Marshal(stu)
    if err != nil {
        fmt.Errorf("Marshal Error %v", err)
    }
    fmt.Println(string(j))

}

output: {"Name":"dtc","Age":22,"Sex":"boy"}

結(jié)構(gòu)體中大寫開頭的變量才可以被json處理雳殊,小寫開頭不會(huì)被處理

Decode

encoding/json包下函數(shù)Unmarshal可以將json解碼為struct

Mashal時(shí)橘沥,結(jié)構(gòu)體的成員變量名將會(huì)直接作為JSON Object的key打包成JSON(前提是struct中的變量首字母大寫);Unmashal時(shí)夯秃,會(huì)自動(dòng)匹配對應(yīng)的變量名進(jìn)行賦值座咆,大小寫不敏感(前提是struct中的變量首字母大寫)

func Unmarshal(p []byte, v interface{}) error

type Student struct {
    Name string
    AgE  int
    sex  string
}

func main() {
    str := []byte(`{"name":"hiehie","age":22,"sex":"girl"}`)
    var stu Student
    err := json.Unmarshal(str, &stu)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(stu)
}
output: {hiehie 22 }

StructTag

可以通過打標(biāo)簽的方式手動(dòng)的配置struct變量和json字段之間的關(guān)系。

type Student struct {
    Name string `json:"stu_name"`
    Age  int    `json:"stu_age"`
    Sex  string `json:"stu_sex"`
}

func main() {
    str := []byte(`{"stu_name":"hiehie","stu_age":22,"stu_sex":"girl"}`)
    var stu Student
    err := json.Unmarshal(str, &stu)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(stu)
}
output:  {hiehie 22 girl}
type Student struct {
    Name string `json:"stu_name"`
    Age  int    `json:"stu_age"`
    Sex  string `json:"stu_sex"`
}

func main() {
    var stu Student = Student{Name: "gigi", Age: 22, Sex: "girl"}
    s, err := json.Marshal(stu)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(s))
}
output: {"stu_name":"gigi","stu_age":22,"stu_sex":"girl"}

tag中設(shè)定omitempty仓洼,如果該字段為nil或零值介陶,則打包的JSON結(jié)果不會(huì)有這個(gè)字段。想要忽略的字段色建,可以在tag中設(shè)置為"-"

type Student struct {
    Name string `json:"stu_name"`
    Age  int    `json:"stu_age,omitempty"`
    Sex  string `json:"-"`
}

func main() {
    var stu Student = Student{Name: "kk", Age: 0, Sex: "girl"}
    s, err := json.Marshal(stu)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(s))
}

output: {"stu_name":"kk"}

interface{}

在不知道JSON數(shù)據(jù)的格式時(shí)哺呜,struct中的類型可以使用interface{}。

interface{}類型在Unmarshal時(shí)箕戳,會(huì)自動(dòng)將JSON轉(zhuǎn)換為對應(yīng)的數(shù)據(jù)類型:

  • JSON的boolean 轉(zhuǎn)換為bool
  • JSON的數(shù)值 轉(zhuǎn)換為float64
  • JSON的字符串 轉(zhuǎn)換為string
  • JSON的Array 轉(zhuǎn)換為[]interface{}
  • JSON的Object 轉(zhuǎn)換為map[string]interface{}
  • JSON的null 轉(zhuǎn)換為nil
type Student struct {
    Name interface{} `json:"name"`
    Age  interface{} `json:"age"`
    Sex  interface{} `json:"sex"`
}

func main() {
    str := []byte(`{"name":"kk","age":22,"sex":"girl"}`)
    stu := new(Student)
    err := json.Unmarshal(str, stu)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(*stu)
}
output:{kk 22 girl}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末某残,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子陵吸,更是在濱河造成了極大的恐慌玻墅,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壮虫,死亡現(xiàn)場離奇詭異椭豫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旨指,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門赏酥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谆构,你說我怎么就攤上這事裸扶。” “怎么了搬素?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵呵晨,是天一觀的道長魏保。 經(jīng)常有香客問我,道長摸屠,這世上最難降的妖魔是什么谓罗? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮季二,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胯舷。我一直安慰自己刻蚯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布桑嘶。 她就那樣靜靜地躺著逃顶,像睡著了一般讨便。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上以政,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天霸褒,我揣著相機(jī)與錄音,去河邊找鬼妙蔗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疆瑰,可吹牛的內(nèi)容都是我干的眉反。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼穆役,長吁一口氣:“原來是場噩夢啊……” “哼寸五!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起耿币,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梳杏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后淹接,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體十性,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年塑悼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劲适。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厢蒜,死狀恐怖霞势,靈堂內(nèi)的尸體忽然破棺而出烹植,到底是詐尸還是另有隱情,我是刑警寧澤愕贡,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布草雕,位于F島的核電站,受9級特大地震影響固以,放射性物質(zhì)發(fā)生泄漏墩虹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一嘴纺、第九天 我趴在偏房一處隱蔽的房頂上張望败晴。 院中可真熱鬧,春花似錦栽渴、人聲如沸尖坤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慢味。三九已至,卻和暖如春墅冷,著一層夾襖步出監(jiān)牢的瞬間纯路,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工寞忿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驰唬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓腔彰,卻偏偏與公主長得像叫编,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子霹抛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理搓逾,服務(wù)發(fā)現(xiàn),斷路器杯拐,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx閱讀 8,328評論 0 16
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    草里有只羊閱讀 18,324評論 0 85
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法霞篡,類相關(guān)的語法,內(nèi)部類的語法端逼,繼承相關(guān)的語法朗兵,異常的語法,線程的語...
    子非魚_t_閱讀 31,632評論 18 399
  • 在我最貧困的時(shí)候 也是別人認(rèn)為我有錢的時(shí)候 這時(shí)候有著在這個(gè)年齡比較高的工資 有著浪蕩的心 欲望心也比較強(qiáng) 然后就...
    愛與她之美閱讀 177評論 0 0