2 回答
TA贡献1775条经验 获得超8个赞
以下是您的代码的工作版本。但是,您需要解决多个问题。
正如本线程其他地方所提到的,您应该将 TubeStatuses(注意大写)设置为一个类型和一个数组。字段名称也应大写,以便导出。
您没有考虑所有输出,并且在某些情况下类型错误。例如,您缺少一个名为“Disruption”的对象。我已经在我的示例中添加了它。“拥挤”声明的类型错误。此外,“route”又名“routeSections”不是字符串。这是另一个数组,可能是对象,但 API 没有输出让我确定 routeSections 实际包含的内容。因此,作为一种解决方法,我将其声明为“json.RawMessage”的一种类型,以允许将其解组为字节片。有关更多详细信息,请参见:https ://golang.org/pkg/encoding/json/#RawMessage
你不能使用
json: "$type"`
. 具体来说,不允许使用美元符号。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type TubeStatuses struct {
TypeDef []string `json:"type"`
IDName string `json:"id"`
Name string `json:"name"`
ModeName string `json:"modeName"`
Disruptions string `json:"disruption"`
Created string `json:"created"`
Modified string `json:"modified"`
LineStatuses []struct {
Status []struct {
TypeDef string `json:"type"`
ID int `json:"id"`
StatusSeverity int `json:"statusSeverity"`
StatusSeverityDescription string `json:"statusSeverityDescription"`
Created string `json:"created"`
ValidityPeriods []struct {
Period struct {
TypeDef string `json: "type"`
FromDate string `json: "fromDate"`
ToDate string `json: "toDate"`
IsNow bool `json: "isNow"`
}
}
Disruption struct {
TypeDef string `json: "type"`
Category string `json: "category"`
CategoryDescription string `json: "categoryDescription"`
Description string `json: "description"`
AdditionalInfo string `json: "additionalInfo"`
Created string `json: "created"`
AffectedRoutes []string `json: "affectedRoutes"`
AffectedStops []string `json: "affectedStops"`
ClosureText string `json: closureText"`
}
}
}
RouteSections json.RawMessage `json: "routeSections"`
ServiceTypes []struct {
Service []struct {
TypeDef string `json:"type"`
Name string `json:"name"`
URI string `json:"uri"`
}
}
Crowding struct {
TypeDef string `json:"type"`
}
}
func main() {
fmt.Println("Now retrieving Underground line status, please wait...")
// two variables (response and error) which stores the response from e GET request
getRequest, err := http.Get("https://api.tfl.gov.uk/line/mode/tube/status")
if err != nil {
fmt.Println("Error!")
fmt.Println(err)
}
fmt.Println("The status code is", getRequest.StatusCode, http.StatusText(getRequest.StatusCode))
//close - this will be done at the end of the function
// it's important to close the connection - we don't want the connection to leak
defer getRequest.Body.Close()
// read the body of the GET request
rawData, err := ioutil.ReadAll(getRequest.Body)
if err != nil {
fmt.Println("Error!")
fmt.Println(err)
}
ts := []TubeStatuses{}
jsonErr := json.Unmarshal(rawData, &ts)
if jsonErr != nil {
fmt.Println(jsonErr)
}
//test
fmt.Println(ts[0].Name)
fmt.Println("Welcome to the TfL Underground checker!\nPlease enter a number for the line you want to check!\n0 - Bakerloo\n1 - central\n2 - circle\n3 - district\n4 - hammersmith & City\n5 - jubilee\n6 - metropolitan\n7 - northern\n8 - piccadilly\n9 - victoria\n10 - waterloo & city")
}
输出...
TA贡献1866条经验 获得超5个赞
您需要该结构的数组:
var tubeStatuses []struct {...}
此外,您的结构成员名称不会被导出,因此即使在您执行此操作后它们也不会被解组。大写名称。
您的结构很大,因此请考虑将其设为类型。
- 2 回答
- 0 关注
- 162 浏览
添加回答
举报