成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言怎么處理三方接口返回數(shù)據(jù)?

開發(fā) 前端
本文我們主要介紹怎么處理三方接口返回數(shù)據(jù),其中包含普通 json 和嵌套 json,在處理嵌套 json 的內(nèi)容中,我們介紹了三方庫 mapstructure 的簡單使用方式。

?1.介紹

在使用 Go 語言調(diào)用三方RESTful接口時,因為無法直接操作 json 字符串,所以我們需要先將 json 字符串轉(zhuǎn)換為 map 或 struct。

本文我們介紹一下怎么處理三方接口返回數(shù)據(jù)。

2.普通 json

我們先看一下三方接口返回的普通 json。

func main() {
// 三方返回普通 json 字符串
jsonRes := `{
"Id": 1001,
"Name": "frank"
}`
data := new(User)
err := json.Unmarshal([]byte(jsonRes), &data)
if err != nil {
log.Printf("json Unmarshal err:%v\n", err)
return
}
fmt.Printf("data=%+v", data)
}

type User struct {
Id int
Name string
}

輸出結(jié)果:

data=&{Id:1001 Name:frank}

閱讀上面這段代碼,我們構(gòu)造一個簡單的 json 字符串,模擬三方接口返回數(shù)據(jù)。

我們使用 Go 標(biāo)準(zhǔn)庫 encoding/json? 的 Unmarshal 函數(shù),可以很容易將 json 數(shù)據(jù)解碼到 struct,從而方便我們讀取返回數(shù)據(jù)。

但是,需要讀者朋友們注意的是,假如三方接口返回數(shù)據(jù)的字段類型隨機變化(比如示例中的 Id? 字段,可能是整型或字符串隨機返回),我們使用 Unmarshal 函數(shù)解碼時,就有可能會返回錯誤,如下所示:

2022/08/15 14:07:41 json Unmarshal err:json: cannot unmarshal string into Go struct field User.Id of type int

閱讀到這里,我相信已經(jīng)有讀者朋友們想到,可以把返回數(shù)據(jù)解碼到 map[string]interface{} 類型的變量中。

示例代碼:

func main() {
// 三方返回普通 json 字符串
jsonRes := `{
"Id": 1001,
"Name": "frank"
}`
data2 := make(map[string]interface{})
err := json.Unmarshal([]byte(jsonRes), &data2)
if err != nil {
log.Printf("json Unmarshal err:%v\n", err)
return
}
fmt.Printf("data2=%+v", data2)
}

輸出結(jié)果:

data2=map[Id:1001 Name:frank]

閱讀上面示例代碼,我們可以通過將返回數(shù)據(jù)解碼到 map[string]interface{} 類型的變量中,從而解決三方接口返回數(shù)據(jù)的字段類型不固定的問題。

普通 json 使用該方式處理確實可行,但是如果嵌套 json,也可以這么處理,但是讀取嵌套 json 的子字段就不那么方便了。

3.嵌套 json

我們再構(gòu)造一個三方接口返回數(shù)據(jù)是嵌套 json 的變量。

func main() {
// 三方返回嵌套 json 字符串
jsonRes := `{
"Id": 1001,
"Name": "frank",
"Details": {
"Gender": "man",
"Age": 18,
"Phone": "13800138000",
"address": "Beijing"
}
}`
data := new(User)
err := json.Unmarshal([]byte(jsonRes), &data)
if err != nil {
log.Printf("json Unmarshal err:%v\n", err)
return
}
fmt.Printf("data=%+v", data)
}

type User struct {
Id int
Name string
Details Details
}

type Details struct {
Gender string
Age int
Phone string
Address string
}

輸出結(jié)果:

data=&{Id:1001 Name:frank Details:{Gender:man Age:18 Phone:13800138000 Address:Beijing}}

閱讀上面這段代碼,我們構(gòu)造一個嵌套 json,使用 Unmarshal 函數(shù)解碼到 struct 中。

但是,如果返回數(shù)據(jù)中的 Age? 字段是字符串類型,我們使用 Unmarshal 函數(shù)解碼時,就會返回以下錯誤:

2022/08/15 17:33:08 json Unmarshal err:json: cannot unmarshal string into Go struct field Details.Details.Age of type int

雖然,我們可以使用普通 json 中的處理方式,將返回數(shù)據(jù)解碼到 map[string]interface{} 類型的變量中。但是,如果我們想要讀取內(nèi)嵌 json 中的子字段,就讀取不到了。

怎么解決這個問題呢?我們可以借助三方庫 mapstructure?,使用該三方庫的 Decode? 函數(shù)替代 Go 標(biāo)準(zhǔn)庫 encoding/json? 的 Unmarshal 函數(shù)。

示例代碼:

func main() {
// 三方返回嵌套 json 字符串
jsonRes := `{
"Id": 1001,
"Name": "frank",
"Details": {
"Gender": "man",
"Age": "18",
"Phone": "13800138000",
"address": "Beijing"
}
}`
tmpData := make(map[string]interface{})
err := json.Unmarshal([]byte(jsonRes), &tmpData)
if err != nil {
log.Printf("json Unmarshal err:%v\n", err)
return
}
data2 := new(User)
err = mapstructure.Decode(tmpData, data2)
if err != nil {
log.Printf("decode err:%v\n", err)
return
}
fmt.Printf("data2=%+v\n", data2)
fmt.Printf("age=%v\n", data2.Details.Age)
}

type User struct {
Id int
Name string
Details Details
}

type Details struct {
Gender string
Age interface{}
Phone string
Address string
}

輸出結(jié)果:

data2=&{Id:1001 Name:frank Details:{Gender:man Age:18 Phone:13800138000 Address:Beijing}}
age=18

閱讀上面這段代碼,我們將嵌套 struct 的 Age? 字段定義為 interface{}? 類型,首先,我們使用 Go 標(biāo)準(zhǔn)庫的 Unmarshal? 函數(shù)將返回數(shù)據(jù)解碼到 map[string]interface{} 類型的變量中。

然后使用三方庫 mapstructure? 的 Decode? 函數(shù),將 map[string]interface{} 類型的變量中的數(shù)據(jù)解碼到 struct 中,從而實現(xiàn)我們可以讀取內(nèi)嵌 json 中的子字段。

三方庫 mapstructure 還有很多其他好用的功能,感興趣的讀者朋友們可以閱讀官方文檔了解更多內(nèi)容。

4.總結(jié)

本文我們主要介紹怎么處理三方接口返回數(shù)據(jù),其中包含普通 json 和嵌套 json,在處理嵌套 json 的內(nèi)容中,我們介紹了三方庫 mapstructure 的簡單使用方式。

責(zé)任編輯:武曉燕 來源: Golang語言開發(fā)棧
相關(guān)推薦

2022-06-26 23:03:14

Go標(biāo)準(zhǔn)庫語言

2024-07-30 09:35:00

2025-01-06 00:00:01

KratosGo微服務(wù)

2013-11-25 13:41:48

2016-10-21 14:09:10

2025-03-04 10:00:00

架構(gòu)接口k開發(fā)

2015-11-05 16:44:37

第三方登陸android源碼

2014-04-08 15:16:00

2021-10-11 06:38:52

Go開源庫語言

2010-03-15 19:02:25

Java編程語言

2023-02-07 15:43:13

三方庫適配鴻蒙

2024-05-15 17:05:16

GoLangflagcast

2023-09-14 10:55:16

2011-04-21 15:40:52

微軟漏洞報告

2023-07-26 08:21:33

2023-03-22 09:09:21

鴻蒙Speexdsp

2023-09-05 15:34:22

三方包鴻蒙

2024-01-09 07:27:09

Go語言代碼

2019-07-30 11:35:54

AndroidRetrofit

2010-07-14 15:18:26

Telnet連接
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 午夜精品影院 | 蜜桃臀av一区二区三区 | jlzzjlzz欧美大全 | 另类亚洲视频 | 精品国产三级 | 久久久高清 | 日韩国产免费观看 | 中文av在线播放 | 91久久精品国产91久久性色tv | 日本天天操 | 日韩一区二区免费视频 | 97精品超碰一区二区三区 | www.色婷婷| 伊人手机在线视频 | 亚洲 欧美 日韩在线 | 欧美久久一区二区三区 | 欧美日韩一区二区三区视频 | 中文字幕1区 | 成人免费一区二区三区视频网站 | 五月婷婷在线播放 | 色男人天堂av | 精品视频在线免费观看 | 激情欧美一区二区三区 | 精品欧美一区二区在线观看 | 先锋资源亚洲 | 国产精品毛片无码 | 国产精品一二三区 | 久久久www成人免费无遮挡大片 | 久久狼人天堂 | 亚洲免费精品一区 | 欧美一级在线观看 | 一区二区成人在线 | 真人毛片 | 国产精品久久久久久妇女6080 | 亚洲天堂av一区 | 极品粉嫩国产48尤物在线播放 | 精品欧美乱码久久久久久1区2区 | 九九国产 | 久草精品视频 | 狠狠插天天干 | 亚洲一区 中文字幕 |