版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 贈錢協(xié)議書范本
- 銷售電熱器協(xié)議書
- 業(yè)績承包協(xié)議書
- 延保退款協(xié)議書
- 營運(yùn)服務(wù)協(xié)議書
- 應(yīng)急住房協(xié)議書
- 2025浙江吉利控股集團(tuán)G-TOP博士專項(xiàng)招聘筆試重點(diǎn)題庫及答案解析
- 展位變更協(xié)議書
- 巡山記錄協(xié)議書
- 舞獅表演協(xié)議書
- 江蘇省鹽城市東臺市2024-2025學(xué)年六年級上學(xué)期期末考試英語試題
- 文物復(fù)仿制合同協(xié)議
- 大貨車司機(jī)管理制度
- 建設(shè)工程施工許可流程
- 2025年新版富士康考試試題及答案全部
- 【低空經(jīng)濟(jì)】低空經(jīng)濟(jì)校企合作方案
- 家具制造行業(yè)企業(yè)專用檢查表
- 2025至2030中國冷凍機(jī)油行業(yè)項(xiàng)目調(diào)研及市場前景預(yù)測評估報(bào)告
- 以租代購房子合同范本
- 2025年地質(zhì)勘查面試題庫及答案
- 書法啟蒙課件
評論
0/150
提交評論