json - 解析 REST API 响应
问题描述
我是golang的新手。我正在编写一个程序来解析 API 的 json 响应:https ://httpbin.org/get 。我使用以下代码来解析响应:
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
type Headers struct {
Close string `json:"Connection"`
Accept string `json:"Accept"`
}
type apiResponse struct {
Header Headers `json:"headers"`
URL string `json:"url"`
}
func main() {
apiRoot := "https://httpbin.org/get"
req, err := http.NewRequest("GET", apiRoot, nil)
if err != nil {
fmt.Println("Couldn't prepare request")
os.Exit(1)
}
response, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer response.Body.Close()
var responseStruct apiResponse
err = json.NewDecoder(response.Body).Decode(&responseStruct)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("%v\n", responseStruct)
}
当我运行此代码时,输出为:
$ go run parse.go
{{close } https://httpbin.org/get}
从输出中,我们可以看到 json 响应中的“Accept”键没有被解码。为什么会这样?如何从响应正文中解析该字符串?
解决方案
您的代码运行良好,但在这里我认为您的Accept
密钥没有从 API 返回,这就是它没有显示Accept
价值的原因。要检查结构的key
,value
对,请使用以下print
方法。
fmt.Printf("%+v\n", responseStruct)
为了克服这种情况,您需要在请求API之前发送请求,Accept
例如:header
req.Header.Set("Accept", "value")
response, err := hc.Do(req)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
然后你会得到struct 中的Accept
值:decoded
{Header:{Accept:value Close:close} URL:https://httpbin.org/get}
推荐阅读
- image - 您如何将大型 sdf 化合物文件转换为包含分子图像的单个文件?
- go - 如何使用 Google 的公钥手动验证 JWT 的签名?
- symfony - 在flush()时没有将Doctrine ORM实体数据持久化到数据库中
- python - 在python中用csv中的列表转换json
- php - 两个日期之间的差异(字符串)
- java - ByteBuddy - 重新定义给定包中的所有类
- python - 有没有办法为 python IDLE 导入 compare_ssim?
- angularjs - 嵌入 ngx-monaco-editor 中没有 InjectionToken 提供程序
- python - Python 3 Selenium 从具有相同 ID 但不同值的下拉菜单中选择
- azure-application-insights - Display Kusto query results as chart