如何在GO中访问JSON的字段

时间:2016-02-26 19:50:44

标签: json go printing

大家好我试着看看从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的?访问该字段的正确方法是什么?

5 个答案:

答案 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")
}

https://golang.org/pkg/encoding/json#Decoder.Decode