01A*_*key 6 json dictionary types go
在Python中你可以做这样的事情:
r = requests.get("http://wikidata.org/w/api.php", params=params)
data = r.json()
Run Code Online (Sandbox Code Playgroud)
现在data
是一个字典或哈希表(也,我不需要事先定义字典的结构),我可以通过做数据["实体"],数据["实体"] ["Q12"来访问键的值"等等
我怎么在golang做这个?到目前为止我有这个:
resp, err := http.Get("http://wikidata.org/w/api.php?"+v.Encode())
if err != nil {
// handle error
}
defer resp.Body.Close()
decoder := json.NewDecoder(resp.Body)
var data interface{}
decodeErr := decoder.Decode(&data)
if decodeErr != nil {
// handle error
}
fmt.Println(data["entities"], data["entities"]["Q"+id])
Run Code Online (Sandbox Code Playgroud)
这给了我编译错误: invalid operation: data["entities"] (index of type interface {})
那应该var data
是什么类型的?我是否需要事先为JSON定义结构,还是可以在不修改代码的情况下处理任何JSON文件/流?
icz*_*cza 24
如果你想要一个字典,使用Go类型map[string]interface{}
(map
带有string
键和任何类型的值):
var data map[string]interface{}
Run Code Online (Sandbox Code Playgroud)
然后你可以参考它的元素,如:
data["entities"]
Run Code Online (Sandbox Code Playgroud)
看这个例子:
s := `{"text":"I'm a text.","number":1234,"floats":[1.1,2.2,3.3],
"innermap":{"foo":1,"bar":2}}`
var data map[string]interface{}
err := json.Unmarshal([]byte(s), &data)
if err != nil {
panic(err)
}
fmt.Println("text =", data["text"])
fmt.Println("number =", data["number"])
fmt.Println("floats =", data["floats"])
fmt.Println("innermap =", data["innermap"])
innermap, ok := data["innermap"].(map[string]interface{})
if !ok {
panic("inner map is not a map!")
}
fmt.Println("innermap.foo =", innermap["foo"])
fmt.Println("innermap.bar =", innermap["bar"])
fmt.Println("The whole map:", data)
Run Code Online (Sandbox Code Playgroud)
输出:
text = I'm a text.
number = 1234
floats = [1.1 2.2 3.3]
innermap = map[foo:1 bar:2]
innermap.foo = 1
innermap.bar = 2
The whole map: map[text:I'm a text. number:1234 floats:[1.1 2.2 3.3]
innermap:map[foo:1 bar:2]]
Run Code Online (Sandbox Code Playgroud)
在Go Playground尝试一下.
笔记:
基本上,如果您的地图是多级的(map
包含另一个map
)"innermap"
,如上例所示,当您访问内部地图时,您可以使用Type断言将其作为另一个地图:
innermap, ok := data["innermap"].(map[string]interface{})
// If ok, innermap is of type map[string]interface{}
// and you can refer to its elements.
Run Code Online (Sandbox Code Playgroud)