Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Go中的数组解析JSON文件_Json_Go - Fatal编程技术网

使用Go中的数组解析JSON文件

使用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文件(如果有人好奇,可以使用OpenWeatherMapAPI)。内置的
编码/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中没有强制转换(只有类型断言和类型转换)。您在这里使用的是类型断言:()您是正确的,我将更新我的答案以反映这一点,这似乎是一个非常好的工具。谢谢