在Go中解析带有数组的JSON文件

时间:2017-08-23 15:07:54

标签: json go

以下是我正在尝试解析的JSON文件(OpenWeatherMap API,如果有人好奇的话)。内置encoding/json做得非常好。当我使用json.Unmarshal(testJson, &parsed)时,大多数JSON文件都被正确解析。然而,随着它的格式化,“天气”让我头疼。

我使用encoding/json解析了parsedMap := parsed.(map[string]interface{})生成的文件,当我尝试使用键“main”引用键值对时,该文件有效。

使用fmt.Println(),值为map[temp:280.32 pressure:1012 humidity:81 temp_min:279.15 temp_max:281.15],我可以使用它。

然而,关键的“天气”,我得到了[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 = // POST中的JSON更早     var parsed interface {}

json.Unmarshal(testJSON, &parsed)

parsedMap := parsed.(map[string]interface{})
mainTemp := parsedMap["weather"]


fmt.Println(mainTemp)

2 个答案:

答案 0 :(得分:1)

您应首先在天气上执行Type断言作为接口{}的数组。

然后在第一个元素上做同样的map [string] interface {}

temps := parsedMap["weather"].([]interface{})
mainTemp := temps[0].(map[string]interface{})

您可以在此处查看完整示例https://play.golang.org/p/JIfCGrsYl9

答案 1 :(得分:0)

问题是您需要转换为[]interface{}

但是,您应该看一下使用JSON to Go轻松生成您期望的JSON的结构类型。您可以删除任何您不感兴趣的字段。

保存了很多类型转换(和错误检查)!