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

Go 語言怎么處理三方接口返回數據?

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

?1.介紹

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

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

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
}

輸出結果:

data=&{Id:1001 Name:frank}

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

我們使用 Go 標準庫 encoding/json? 的 Unmarshal 函數,可以很容易將 json 數據解碼到 struct,從而方便我們讀取返回數據。

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

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

閱讀到這里,我相信已經有讀者朋友們想到,可以把返回數據解碼到 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)
}

輸出結果:

data2=map[Id:1001 Name:frank]

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

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

3.嵌套 json

我們再構造一個三方接口返回數據是嵌套 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
}

輸出結果:

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

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

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

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

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

怎么解決這個問題呢?我們可以借助三方庫 mapstructure?,使用該三方庫的 Decode? 函數替代 Go 標準庫 encoding/json? 的 Unmarshal 函數。

示例代碼:

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
}

輸出結果:

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

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

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

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

4.總結

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

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2022-06-26 23:03:14

Go標準庫語言

2024-07-30 09:35:00

2025-01-06 00:00:01

KratosGo微服務

2016-10-21 14:09:10

2013-11-25 13:41:48

2014-04-08 15:16:00

2015-11-05 16:44:37

第三方登陸android源碼

2025-03-04 10:00:00

架構接口k開發

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語言代碼

2010-07-14 15:18:26

Telnet連接

2014-07-23 08:55:42

iOSFMDB
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本在线中文 | 精品亚洲一区二区 | 大香网伊人| 国产乱码精品一区二区三区中文 | 91污在线| 在线欧美激情 | 日韩毛片中文字幕 | www.亚洲一区二区三区 | 久久精品国产亚洲a | 91福利网| 这里只有精品999 | 成人免费观看视频 | 欧美日韩一区二区在线 | 亚洲精品自拍视频 | 97国产爽爽爽久久久 | 日韩在线免费 | 亚洲综合一区二区三区 | 久久亚洲国产精品日日av夜夜 | 国产精品久久久久免费 | 一级h片| 涩色视频在线观看 | 久色视频在线观看 | 日本天堂一区 | 亚洲欧美中文日韩在线v日本 | 91影院| 亚洲在线一区 | 国产日韩视频在线 | 日屁网站 | 欧美亚洲视频在线观看 | 国产精品视频久久 | 黄色网络在线观看 | 久久久久久综合 | www.五月天婷婷.com | 日韩精品免费视频 | 黄a免费网络 | 久久91精品 | 国产99热 | 欧美高清hd| 天天夜天天操 | 国产免费拔擦拔擦8x高清 | 国产成人麻豆免费观看 |