为了账号安全,请及时绑定邮箱和手机立即绑定

再次解析复杂的 JSON

再次解析复杂的 JSON

Go
尚方宝剑之说 2022-10-24 16:08:36
我有一些通过 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"
查看完整描述

1 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

首先关闭

  1. 我希望您遇到的问题是没有使用标签。要解析 JSON,结构的名称必须与 JSON 字段中的名称匹配。在这里阅读Golang Marshal

  2. 其次 wfMetadata 有一个小写的第一个字母,这意味着它不会被导入。

  3. 第三,workflow.metadataandworkflow.items[i].spec.arguments被设置为 a{}而不是 emptystring ""。我认为他们不应该是stringinterface{}如果您不知道或不关心,则可以使用 open 来避免这种情况,或者使用您要连接的 API 中的官方文档实际实现它们。

  4. 作为说明,使用[]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


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信