当前位置: 首页 > 面试题库 >

在Python中将任何JSON转换为标准字典的golang等效项是什么?

宓毅庵
2023-03-14
问题内容

在Python中,您可以执行以下操作:

r = requests.get("http://wikidata.org/w/api.php", params=params)
data = r.json()

现在data是一个dict或哈希表(同样,我不需要预先定义dict的结构),并且我可以通过执行data [“ entities”],data [“
entities”] [“ 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])

这给了我编译错误: invalid operation: data["entities"] (index of type interface {})

那应该var data是什么类型呢?我是否需要预先为JSON定义结构,还是可以在不修改代码的情况下处理任何JSON文件/流?


问题答案:

如果您要使用字典,请使用Go类型map[string]interface{}map带有string任何类型的键和值的Go 类型):

var data map[string]interface{}

然后您可以引用其元素,例如:

data["entities"]

请参阅以下示例:

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)

输出:

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]]

在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.


 类似资料:
  • 问题内容: 我无法访问JSON中的数据。我究竟做错了什么? 问题答案: 将字典转换为对象,而不是对象!因此,您必须使用方法将其加载到 请参阅作为保存方法和检索方法。 这是代码示例,可以帮助您进一步了解它:

  • 我无法访问JSON中的数据。我做错了什么?

  • 问题内容: 我有一个字典列表,看起来像这样: 等等。列表中可能还有更多文档。我需要将它们转换为一个JSON文档,可以通过bottle返回该文档,但我不知道该怎么做。请帮忙。我在该网站上看到了类似的问题,但是我无法理解那里的解决方案。 问题答案: 使用json库 顺便说一句,您可能会考虑将变量列表更改为另一个名称,这是用于创建列表的内置函数,如果不更改变量名称,则可能会出现一些意外行为或错误代码。

  • 问题内容: 目前,我有这本词典,使用印刷: 当我这样做时: 我收到此错误: 问题答案: 如果您可以在json中使用不可打印的符号,请添加到通话中。 如果是假的,那么返回值将是一个 实例受到正常的Python来 强制规则,而不是被转义为ASCII 。

  • 问题内容: 我一直在寻找有关此问题的答案,但似乎无法找到答案。也许到了傍晚才找出答案,所以我转向这里的优秀读者。 我从CouchDB记录中提取了以下JSON数据: 此数据存储在Python字典中,该字典位于称为“ ” 的字典中键“ ” 下。我想将此数据从CouchDB转换为Python dict,以便可以在Django模板中执行以下操作: 我发现了很多有关将字典转换为JSON的信息,但是没有其他方

  • 问题内容: 我最近使用的Train status API在JSON对象中添加了两个额外的键值对,这导致我的脚本崩溃。 这是字典: 毫不奇怪,我得到了以下错误: 如果我没记错的话,我认为这是因为JSON响应中的布尔值是/,而Python可以识别/ 。有什么办法解决吗? PS:我尝试将的JSON响应转换为字符串,然后将其转换回布尔值,结果发现如果字符串中有任何字符,我总会得到一个值。我有点卡在这里。