需求1:返回数据格式如下,但我们只需要返回data下面的数据;
{
"data": [{
"name": "zhangsan"
}, {
"name": "lisi"
}]
}
示例代码
#test方法请求
func test(apiUrl) ([]interface{}, error) {
resp, err := curlGet(apiUrl)
if err != nil {
if _, ok := resp["data"]; ok {
respData := resp["data"].([]interface{})
return respData, nil
}
} else {
return nil, err
}
}
#curl方法定义
func curlGet(apiUrl) gin.H {
client := http.Client{}
resp, err := client.Get(apiUrl)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
fmt.Println("resp:", string(body))
var respData gin.H
if err := json.Unmarshal(body, &respData); err != nil {
return nil, err
}
log.Printf("format: %v", respData)
return respData, nil
}
此demo中,从json取得数据为map[string]interface{}类型,在test方法中,我们要求只返回data下数据,所以要给一个合适类型,定义过struct,效果不好,却忽略了最简单的类型 []interface。
当然,如果你不需要做这么复杂,整体返回就ok了,那可以忽略。
=========================================================================
需求二:获取json中的数据,并进行操作。
{
"data": [{
"name": "zhangsan"
}, {
"name": "lisi"
}]
}
此处的curl定义就不再赘述。
#test方法请求
func test(apiUrl) error {
resp, err := curlGet(apiUrl)
if err != nil {
if _, ok := resp["data"]; ok {
respData := resp["data"].([]struct{
Name string `json:"name"`
})
for item, key := range respData {
fmt.Println(”key = ", key, " => name = ", item.Name)
}
}
} else {
return nil, err
}
}
其他情况,遇到了再说,当然需求二也可以用遍历去实现。