偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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 標準庫 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 標準庫 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 標準庫的 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標準庫語言

2024-07-30 09:35:00

2025-01-06 00:00:01

KratosGo微服務(wù)

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

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

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技術(shù)棧公眾號