再次解析复杂的 JSON

我有一些通过 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"


尚方宝剑之说
浏览 93回答 1
1回答

一只斗牛犬

首先关闭我希望您遇到的问题是没有使用标签。要解析 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
打开App,查看更多内容
随时随地看视频慕课网APP