大家好我试着看看从http.get请求中访问json对象字段的正确方法。
我首先做一个http.get调用获取JSON,然后打印它(有效)但有没有办法只访问一个字段?
例如:
response, err:= http.Get("URL")
//Error checking is done between
contents, err:=ioutil.Readall(response.Body)
//Now at this point I have a json that looks like
{"id": "someID",
"name": "someName",
"test": [{"Name":"Test1",
"Result": "Success"},
{"Name":"Test2",
"Result": "Success"},
{...},
]}
有没有办法只打印"测试" Json的?访问该字段的正确方法是什么?
答案 0 :(得分:4)
使用encoding/json
包将数据解组到struct中,如下所示。
type Result struct {
ID string `json:"id"`
Name string `json:"name"`
Test []interface{} `json:"test"`
}
var result Result
json.Unmarshal(contents, &result)
fmt.Println(result.Test)
您还可以将Test
解析为特定结构。
答案 1 :(得分:2)
与上一个答案相同,使用encoding / json包来解组数据。但是如果您不想指定结构,可以使用map [string] interface / bson.M {}来接收数据,然后获取字段,然后将其转换为您想要的类型。
m := make(map[string]interface{})
err := json.Unmarshal(data, &m)
if err != nil {
log.Fatal(err)
}
fmt.Println(m["id"])
答案 2 :(得分:0)
如果您不确定JSON层次结构的深度,可能需要尝试使用gabs容器。看看下面的资源
https://github.com/Jeffail/gabs https://godoc.org/github.com/Jeffail/gabs
答案 3 :(得分:0)
如果您只想访问一个字段,则可以使用jsonq模块https://godoc.org/github.com/jmoiron/jsonq
对于您的示例,您可以使用类似于
的代码获取测试对象/me/messages/{id}
其中jq是根据上面的JSON构造的jsonq查询对象(有关如何根据JSON流或字符串创建查询对象的说明,请参见godoc页面)。
您还可以使用此库在JSON对象内的任意深度处检索特定的String,Integer,Float和Bool值。
答案 4 :(得分:0)
由于您从 URL 开始,Decode
是比 Unmarshal
更好的选择:
package main
import (
"encoding/json"
"net/http"
)
func main() {
r, e := http.Get("https://github.com/manifest.json")
if e != nil {
panic(e)
}
defer r.Body.Close()
var s struct { Name string }
json.NewDecoder(r.Body).Decode(&s)
println(s.Name == "GitHub")
}