一、golang http请求json响应解析方法
在golang web编程中,json格式是常见的传输格式,那么json数据要怎么解析呢?
例如下面请求地址
http://api.open-notify.org/astros.json
响应数据如下:
{
"number": 3,
"message": "success",
"people": [{
"craft": "iss",
"name": "chris cassidy"
}, {
"craft": "iss",
"name": "anatoly ivanishin"
}, {
"craft": "iss",
"name": "ivan vagner"
}]
}
下面是一个http请求并解析json数据到结构体里的示例
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"time"
)
type people struct {
number int `json:"number"`
}
func main() {
url := "http://api.open-notify.org/astros.json"
spaceclient := http.client{
timeout: time.second * 2, // maximum of 2 secs
}
req, err := http.newrequest(http.methodget, url, nil)
if err != nil {
log.fatal(err)
}
req.header.set("user-agent", "spacecount-tutorial")
res, geterr := spaceclient.do(req)
if geterr != nil {
log.fatal(geterr)
}
if res.body != nil {
defer res.body.close()
}
body, readerr := ioutil.readall(res.body)
if readerr != nil {
log.fatal(readerr)
}
people1 := people{}
jsonerr := json.unmarshal(body, &people1)
if jsonerr != nil {
log.fatal(jsonerr)
}
fmt.println(people1.number)
}
按照以上的方法可以正确解析数据
二、golang json解析失败示例与原因
同样是上面的示例,我们把结构体中改变一下
type people struct {number int `json:"number"`}将number改成了小写字母开头的number,再次执行一下就会发现,无法正常解析了
原因
其实原因很简单,golang首字母大小写意味着改变了成员的访问权限,小写就变成私有的了,不同package是无法访问其他package的私有成员的,导致json.marshal(其使用了reflect)无法反射到内容。
打个比方,你如果把json.marshal(hp) 这个方法的重新实现在main方法下面,struct中的成员变量就可以小写了。
注意
struct内的成员变量小写就只有当前包内可以访问。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论