使用Go中的数组解析JSON文件
下面是我试图解析的JSON文件(如果有人好奇,可以使用OpenWeatherMapAPI)。内置的使用Go中的数组解析JSON文件,json,go,Json,Go,下面是我试图解析的JSON文件(如果有人好奇,可以使用OpenWeatherMapAPI)。内置的编码/json做得相当好。当我使用json.Unmarshal(testJson,&parsed)时,大部分json文件都被正确解析。然而,就格式而言,“天气”让我头疼 我用parsedMap:=parsed.(map[string]interface{})解析了由encoding/json生成的文件,当我尝试引用键、值对和键“main”时,它会起作用 使用fmt.Println(),值是map[t
编码/json
做得相当好。当我使用json.Unmarshal(testJson,&parsed)
时,大部分json文件都被正确解析。然而,就格式而言,“天气”让我头疼
我用parsedMap:=parsed.(map[string]interface{})
解析了由encoding/json
生成的文件,当我尝试引用键、值对和键“main”时,它会起作用
使用fmt.Println()
,值是map[temp:280.32 pressure:1012湿度:81 temp\u min:279.15 temp\u max:281.15]
,我可以使用它
但是,通过“weather”键,我得到了这个[map[icon:09d id:300 main:Drizzle description:light intensity Drizzle]
。额外的方括号似乎引起了一些问题
{
"coord": {
"lon": -0.13,
"lat": 51.51
},
"weather": [
{
"id": 300,
"main": "Drizzle",
"description": "light intensity drizzle",
"icon": "09d"
}
],
"base": "stations",
"main": {
"temp": 280.32,
"pressure": 1012,
"humidity": 81,
"temp_min": 279.15,
"temp_max": 281.15
},
"visibility": 10000,
"wind": {
"speed": 4.1,
"deg": 80
},
"clouds": {
"all": 90
},
"dt": 1485789600,
"sys": {
"type": 1,
"id": 5091,
"message": 0.0103,
"country": "GB",
"sunrise": 1485762037,
"sunset": 1485794875
},
"id": 2643743,
"name": "London",
"cod": 200
}
参考代码:
var testJSON=//文章前面的JSON
var解析接口{}
json.Unmarshal(testJSON, &parsed)
parsedMap := parsed.(map[string]interface{})
mainTemp := parsedMap["weather"]
fmt.Println(mainTemp)
您应该首先以接口{}数组的形式对weather执行类型断言 然后对第一个元素执行与map[string]接口{}相同的操作
temps := parsedMap["weather"].([]interface{})
mainTemp := temps[0].(map[string]interface{})
您可以在这里看到一个完整的示例问题是您需要转换为
[]接口{}
但是,您应该了解如何使用来轻松地为预期的JSON生成结构类型。你可以去掉任何你不感兴趣的领域
节省了大量类型转换(和错误检查) 我不明白到底是什么问题;为什么需要帮助?这是预期的行为:如果有任何不同,
json.Unmarshal
将无法处理单长度切片,例如您在json中使用的切片。@NatNgs基本上我只需要帮助“删除方括号”。当我试图将它引用为数组(引用索引0)时,它没有work@NatNgs它抛出了一个错误,说明“无效操作:mainTemp[0](类型接口{}不支持索引)有效,谢谢。我想这对我在围棋的第一天编程来说太难了。同样也无助于golang.org在我目前居住的地方(中国)被禁止,我的可用资源有限。值得注意的是,go中没有强制转换(只有类型断言和类型转换)。您在这里使用的是类型断言:()您是正确的,我将更新我的答案以反映这一点,这似乎是一个非常好的工具。谢谢