我有一些通過 API 呼叫獲得的 JSON,我現在想使用 JSON 決議它,我遵循了一個關于如何使用結構決議 JSON 的在線教程,但我的實際 JSON 比他們使用的要復雜得多。這是我擁有的 JSON 示例:
{
"metadata": {},
"items": [
{
"metadata": {
"name": "run7",
"namespace": "default",
"uid": "e218fcc4",
"creationTimestamp": "2022-01-01T00:00:00Z"
},
"spec": {
"arguments": {}
},
"status": {
"phase": "Succeeded",
"startedAt": "2022-01-01T00:00:00Z",
"finishedAt": "2022-01-01T00:00:00Z"
}
}
]
}
這是我為它創建的結構:
type wfSpec struct{
Arguments string
}
type wfStatus struct {
Phase string
StartedAt string
FinishedAt string
}
type wfMetadata struct {
Name string
Namespace string
Uid string
CreationTimestamp string
}
type Metadata []struct {
Data string
}
type Items []struct {
wfMetadata
wfStatus
wfSpec
}
type Workflow struct {
Metadata Metadata
Items Items
}
當我第一次嘗試使用列印值fmt.Printf(workflows.Items.wfMetadata.Name)時出現錯誤workflows.Items.Metadata undefined (type Items has no field or method Metadata),所以我嘗試使用列印整個內容fmt.Printf(workflows),但出現此錯誤cannot use workflows (type Workflow) as type string in argument to fmt.Printf
我需要從 JSON 決議的唯一資料是
"name": "run7",
"namespace": "default",
"uid": "e218fcc4",
"creationTimestamp": "2022-01-01T00:00:00Z"
uj5u.com熱心網友回復:
首先關閉
- 我希望您遇到的問題是沒有使用標簽。要決議 JSON,結構的名稱必須與 JSON 欄位中的名稱匹配。在這里閱讀Golang Marshal
- 其次 wfMetadata 有一個小寫的第一個字母,這意味著它不會被匯入。
- 第三,
workflow.metadataandworkflow.items[i].spec.arguments被設定為 a{}而不是 emptystring""。我認為他們不應該是string。interface{}如果您不知道或不關心,可以使用 open 來避免這種情況,或者使用您正在連接的 API 中的官方檔案實際實作它們。 - 作為說明,使用
[]struct對我來說似乎是錯誤的。而是在用法中定義它
請注意,通過使用像jetbrains 的 GoLand這樣的 IDE,他們首先支持通過簡單地將 JSON 粘貼到
.go檔案中來將 JSON 轉換為結構。他們一開始可能會讓人望而生畏,但確實有很大幫助,并且會在幾秒鐘內為您完成大部分作業。
現在試試這個,并了解為什么以及如何更好地作業。
type Status struct {
Phase string `json:"phase"`
StartedAt string `json:"startedAt"`
FinishedAt string `json:"finishedAt"`
}
type ItemMetadata struct {
Name string `json:"name"`
Namespace string `json:"namespace"`
UID string `json:"uid"`
CreationTimestamp string `json:"creationTimestamp"`
}
type Items struct {
Metadata ItemMetadata `json:"metadata"`
Status Status `json:"status"`
Spec interface{} `json:"spec"`
}
type Workflow struct {
Metadata interface{} `json:"metadata"`
Items []Items `json:"items"`
}
操場上的作業示例https://go.dev/play/p/d9rT4FZJsGv
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/410063.html
標籤:
