Golang實(shí)現(xiàn)解析JSON的三種方法總結(jié)_第1頁
Golang實(shí)現(xiàn)解析JSON的三種方法總結(jié)_第2頁
Golang實(shí)現(xiàn)解析JSON的三種方法總結(jié)_第3頁
Golang實(shí)現(xiàn)解析JSON的三種方法總結(jié)_第4頁
Golang實(shí)現(xiàn)解析JSON的三種方法總結(jié)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第Golang實(shí)現(xiàn)解析JSON的三種方法總結(jié)目錄背景示例Json例子解釋1)反序列化成map2)反序列化成對象3)復(fù)雜json的解析總結(jié)

背景

這是一篇寫給0-1年新人的文章,短平快的教會你如何解析json字符串。

示例Json

假設(shè)有如下json字符串:

{

"userName":"admin",

"nick_name":"管理員",

"info":{

"age":18

"extra":[

"address":"上海市"

"address":"北京市"

我們來看看,如何在go中解析。

例子

直接上代碼:

packagemain

import(

"encoding/json"

"log"

"/tidwall/gjson"

//嵌套一個對象

typeInfostruct{

Ageint`json:"age"`

varinfo=Info{Age:12}

//嵌套一個對象數(shù)組

typeExtrastruct{

Addressstring`json:"address"`

//定義需要反序列化的結(jié)構(gòu)體

typeUserRequeststruct{

Namestring`json:"userName"`//通過tag里面的json,來指定json字符串中該字段的值從那里解析,不需要和字段名一樣

NickNamestring`json:"nick_name"`//如果沒對應(yīng)上,解析不了

infoInfo`json:"info"`//小寫私有的,故反序列化失效,該字段永遠(yuǎn)為空

Extra[]Extra`json:"extra"`

funcmain(){

jsonStr:=`

"userName":"admin",

"nick_name":"管理員",

"info":{

"age":18

"extra":[

"address":"上海市"

"address":"北京市"

//方式一:序列化成map,經(jīng)常使用

anyMap:=make(map[string]interface{},0)

iferr:=json.Unmarshal([]byte(jsonStr),anyMap);err!=nil{

panic(err)

log.Println("Unmarshaltomapresult:",anyMap)

//方式二:反序列化成對象,經(jīng)常使用

req:=UserRequest{}

iferr:=json.Unmarshal([]byte(jsonStr),req);err!=nil{

panic(err)

log.Println("Unmarshaltostruct:",req)

//方式三:不反序列化,只讀取單個key,經(jīng)常使用。適合特別復(fù)雜的json字符串,或者有多種ifelse結(jié)構(gòu)的場景

userName:=gjson.Get(jsonStr,"userName")

nickName:=gjson.Get(jsonStr,"nick_name")

age:=gjson.Get(jsonStr,"info.age").Int()

//取得extra數(shù)組0位置的對象

address1:=gjson.Get(jsonStr,"extra").Array()[1]

log.Println("getrawvaluebykey:",userName,nickName,age,address1.Get("address"))

運(yùn)行后輸出:

2025/09/1311:09:13Unmarshaltomapresult:map[extra:[map[address:上海市]map[address:北京市]]info:map[age:18]nick_name:管理員userName:admin]

2025/09/1311:09:13Unmarshaltostruct:{admin管理員{0}[{上海市}{北京市}]}

2025/09/1311:09:13getrawvaluebykey:admin管理員18北京市

解釋

1)反序列化成map

anyMap:=make(map[string]interface{},0)

iferr:=json.Unmarshal([]byte(jsonStr),anyMap);

//...

我們看到,key是string,value是interface{},所以你取值的時候,需要這樣?。?/p>

ageVal,ok:=anyMap["age"]

ifok{

age:=ageVal.(int)

log.Println(age)

是不是感覺非常麻煩?一是需要判斷key是否存在,二是類型轉(zhuǎn)換。

所以,反序列化時這種方式不是很常用,但是序列化的時候,非常方便,用的較多。

比如在gin框架中,就被大量使用:

typeLoginReqstruct{

UserNamestring`json:"user_name"`

funconLogin(ctx*gin.Context){

req:=LoginReq{}

iferr:=ctx.BindJSON(req);err!=nil{

ctx.Error(err)

ifreq.UserName=="admin"{

ctx.JSON(http.StatusOK,gin.H{"code":0,"msg":"success"})

}else{

ctx.JSON(http.StatusUnauthorized,gin.H{"code":-1,"msg":"賬號錯誤!"})

看到gin.H了嗎?實(shí)際上就是:

//Hisashortcutformap[string]interface{}

typeHmap[string]interface{}

所以:

ctx.JSON(http.StatusOK,gin.H{"code":0,"msg":"success”})

等價于:

ctx.JSON(http.StatusOK,map[string]interface{}{"code":0,"msg":"success"})

這樣做的好處是,不需要預(yù)先定義結(jié)構(gòu)體,直接通過語法糖實(shí)現(xiàn),代碼更簡潔。

2)反序列化成對象

這個是最常用的,通過`json.Unmarshal`把二進(jìn)制反序列化成對象,通過`json.Marshal()`把對象序列化成json字符串。需要注意的是:

字段tag中的名字要和json字符串中的對應(yīng),否則解析不到值

字段名不能是小寫開頭,私有的字段無法將被忽略,也會解析不到值

支持嵌套,由go標(biāo)準(zhǔn)庫通過反射自動完成

3)復(fù)雜json的解析

有時候,一個json非常復(fù)雜,或者你只需要取某個字段,那么就可以使用這種方式:

userName:=gjson.Get(jsonStr,"userName")

別忘記,gjson不是標(biāo)準(zhǔn)庫的包,需要使用goget/tidwall/gjson安裝。

總結(jié)

本文介紹了解析json的3種方式:

直接解析成map[string]interface{}解析成對象讀取單個key

這3種方式?jīng)]有好壞之分,只看具體的場景,靈活使用即可。唯一不變的是,都是通過`json.Unmarshal`把二進(jìn)制反序列化成對象,通過`json.Marshal()`把對象

序列化成json字符串。

加餐:什么是序列化?

百科中說:序列化(Serialization)是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。

通俗點(diǎn)說就是因

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論