gpt4 book ai didi

arrays - 将 json 数组解码为 go struct(数组位于 JSON 字符串的中间

转载 作者:IT王子 更新时间:2023-10-29 01:38:37 25 4
gpt4 key购买 nike

我是 Go 的新手。我正在使用天气 API。我已经注释掉了导致错误的部分。我已经看到其他几个有类似问题的链接,但是它们似乎都没有在 JSON 字符串的中间有数组。我确定有一种方法可以用 slice 定义结构。我似乎无法获得允许它的语法。这是我卡住的地方:

package main

import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
)

// WeatherData struct to collect data from the API call
type WeatherData struct {
Wind Wind
Sys Sys
// Weather Weather
Name string `json:"name"`
}

////////////// ERROR when unmarshalling this struct /////////
// Weather provides basic weather info
// type Weather struct {
// ID int `json:"id"`
// Descrip string `json:"description"`
// Icon string `json:"icon"`
// }
/////////////////////////////////////////////////////////////

// Sys includes sunrise, sunset, country, etc.
type Sys struct {
Country string `json:"country"`
}

// Wind struct to get specific wind characteristics
type Wind struct {
Speed float64 `json:"speed"`
Degree float64 `json:"deg"`
Gust float64 `json:"gust"`
}

func main() {
res, getErr := http.Get("http://api.openweathermap.org/data/2.5/weather?zip=REMOVED,us&appid=REMOVEDBUTWILLPOSTJSONData")
if getErr != nil {
log.Fatalln("http.Get error: ", getErr)
}
defer res.Body.Close()
body, readErr := ioutil.ReadAll(res.Body)
if readErr != nil {
log.Fatalln("Read Error: ", readErr)
}
//////////// UNABLE TO UNMARSHAL the array that passes through here ////
var data WeatherData
if err := json.Unmarshal(body, &data); err != nil {
panic(err)
}

fmt.Println("Wind gusts: ", data.Wind.Gust)
fmt.Println("Wind speed: ", data.Wind.Speed)
fmt.Println("Wind degrees: ", data.Wind.Degree)

fmt.Println("Country is: ", data.Sys.Country)
fmt.Println("City is: ", data.Name)

///////////////// CAN'T ACCESS Description...or anything in Weather
// fmt.Println("Country is: ", data.Weather.Descrip) // cannot access due to this portion being inside an array

}



/////////////////THIS IS THE JSON DATA THAT IS AVAILABLE ///////////
{
"coord": {
"lon": -97.31,
"lat": 32.94
},
"weather": [ // CAN'T ACCESS THIS CORRECTLY
{
"id": 800,
"main": "Clear",
"description": "clear sky",
"icon": "01d"
}
],
"base": "stations",
"main": {
"temp": 306.46,
"pressure": 1014,
"humidity": 55,
"temp_min": 306.15,
"temp_max": 307.15
},
"visibility": 16093,
"wind": {
"speed": 5.1,
"deg": 150,
"gust": 7.2
},
"clouds": {
"all": 1
},
"dt": 1499120100,
"sys": {
"type": 1,
"id": 2597,
"message": 0.0225,
"country": "US",
"sunrise": 1499081152,
"sunset": 1499132486
},
"id": 0,
"name": "Fort Worth",
"cod": 200
}

最佳答案

您必须在 WeatherData 中定义 Weather 结构的 slice 。

取消注释 Weather 结构并将 WeatherData 结构更新为以下内容。

// WeatherData struct to collect data from the API call
type WeatherData struct {
Wind Wind `json:"wind"`
Sys Sys `json:"sys"`
Weather []Weather `json:"weather"`
Name string `json:"name"`
}

请查看示例代码:https://play.golang.org/p/4KFqRuxcx2

关于arrays - 将 json 数组解码为 go struct(数组位于 JSON 字符串的中间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44895535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com