当前位置: 首页 > 科技观察

Go语言如何处理三方接口返回的数据?_0

时间:2023-03-15 13:33:35 科技观察

1。简介在使用Go语言调用三方RESTful接口时,由于无法直接操作json串,需要先将json串转为map或struct。在本文中,我们介绍如何处理三方接口返回的数据。2.普通json先来看三方接口返回的普通json。funcmain(){//三方返回普通json字符串jsonRes:=`{"Id":1001,"Name":"frank"}`data:=new(User)err:=json.Unmarshal([]byte(jsonRes),&data)iferr!=nil{log.Printf("jsonUnmarshalerr:%v\n",err)return}fmt.Printf("data=%+v",data)}type用户结构{idintNamestring}输出结果:data=&{Id:1001Name:frank}看了上面的代码,我们构造了一个简单的json字符串来模拟三方接口返回数据。我们使用Go标准库encoding/json的Unmarshal函数,可以很方便的将json数据解码成struct,方便我们读取返回的数据。但是需要读者注意的是,如果三方接口返回的数据的字段类型是随机变化的(比如例子中的Id字段,可能是整数,也可能是随机返回字符串),当我们使用Unmarshal函数解码,有可能会报错,如下图:2022/08/1514:07:41jsonUnmarshalerr:json:cannotunmarshalstringintoGostructfieldUser.Idoftypeint之后读到这里,相信有的读者已经想到了,可以将返回的数据解码成一个map[string]interface{}类型的变量。示例代码:funcmain(){//三方返回普通json字符串jsonRes:=`{"Id":1001,"Name":"frank"}`data2:=make(map[string]interface{})err:=json.Unmarshal([]byte(jsonRes),&data2)iferr!=nil{log.Printf("jsonUnmarshalerr:%v\n",err)return}fmt.Printf("data2=%+v",data2)}输出结果:data2=map[Id:1001Name:frank]看上面的示例代码,我们可以将返回的数据解码成一个map[string]interface{}类型的变量来解析返回的数据三方接口字段类型不固定的问题。这样处理普通的json确实是可行的,但是嵌套json的话也可以这样处理,只是嵌套json的子字段读取起来不是那么方便。3、对于嵌套json,我们构造一个第三方接口返回数据,数据是嵌套json的一个变量。funcmain(){//三方返回嵌套json字符串jsonRes:=`{"Id":1001,"Name":"frank","Details":{"Gender":"man","Age":18,"Phone":"13800138000","address":"北京"}}`data:=new(User)err:=json.Unmarshal([]byte(jsonRes),&data)iferr!=nil{log.Printf("jsonUnmarshalerr:%v\n",err)return}fmt.Printf("data=%+v",data)}typeUserstruct{IdintNamestringDetailsDetails}typeDetailsstruct{性别字符串年龄intPhonestringAddressstring}输出结果:data=&{Id:1001Name:frankDetails:{Gender:manAge:18Phone:13800138000Address:Beijing}}看了上面的代码,我们构造了一个嵌套的json,使用Unmarshal函数解码成一个结构。但是,如果返回数据中的Age字段是字符串类型,当我们使用Unmarshal函数对其解码时,会返回如下错误:2022/08/1517:33:08jsonUnmarshalerr:json:cannotunmarshalstringintoGostructfieldDetails.Details.Ageoftypeofint虽然,我们可以使用普通json中的处理方式,将返回的数据解码成map[string]interface{}类型的变量。但是,如果我们要读取嵌入的json中的子字段,我们将无法读取它们。如何解决这个问题呢?我们可以使用三方库mapstructure,并使用三方库的Decode函数来代替Go标准库encoding/json的Unmarshal函数。示例代码:funcmain(){//三重返回嵌套的json字符串jsonRes:=`{"Id":1001,"Name":"frank","Details":{"Gender":"man","Age":"18","Phone":"13800138000","address":"北京"}}`tmpData:=make(map[string]interface{})err:=json.Unmarshal([]byte(jsonRes),&tmpData)iferr!=nil{log.Printf("jsonUnmarshalerr:%v\n",err)return}data2:=new(User)err=mapstructure.Decode(tmpData,data2)iferr!=nil{log.Printf("解码错误:%v\n",err)return}fmt.Printf("data2=%+v\n",data2)fmt.Printf("age=%v\n",data2.Details.Age)}typeUserstruct{IdintNamestringDetailsDetails}typeDetailsstruct{GenderstringAgeinterface{}PhonestringAddressstring}输出结果:data2=&{Id:1001Name:frankDetails:{Gender:manAge:18Phone:13800138000Address:Beijing}}age=18阅读上面的代码,我们将嵌套结构体的Age字段定义为interface{}类型,首先我们使用Go标准库的Unmarshal函数来返回数据被解码成变量e类型为map[string]interface{}。然后使用三方库mapstructure的Decode函数将map[string]interface{}类型变量中的数据解码成struct,这样我们就可以读取嵌入的json中的子字段了。三方库mapstructure还有许多其他有用的功能。有兴趣的读者可以阅读官方文档了解更多。4.小结本文主要介绍如何处理三方接口返回的数据,包括普通json和嵌套json。在处理嵌套json的内容中,我们介绍了三方库mapstructure的简单使用。