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

在 Go 中是否有更简单的方法来解码这个 json?

在 Go 中是否有更简单的方法来解码这个 json?

Go
aluckdog 2023-07-10 15:02:34
我正在尝试将 Jira 中的一些 JSON 解析为变量。这是使用 go-jira 包(https://godoc.org/github.com/andygrunwald/go-jira)目前我有一些代码可以让开发人员:dev := jiraIssue.Fields.Unknowns["customfield_11343"].(map[string]interface{})["name"]和team := jiraIssue.Fields.Unknowns["customfield_12046"].([]interface{})[0].(map[string]interface{})["value"]获得他们所属的团队。获取他们所在的团队有点粗糙,除了必须键入断言、设置索引,然后再次键入断言之外,是否有更干净的方法来获取团队?这是完整的 json(已修改但结构相同,太长了):{     "expand":"renderedFields,names,schema,operations,editmeta,changelog,versionedRepresentations",   "id":"136944",   "self":"https://jira.redacted.com/rest/api/2/issue/136944",   "key":"RM-2506",   "fields":{        "customfield_11343":{           "self":"https://redacted.com/rest/api/2/user?username=flast",         "name":"flast",         "key":"flast",         "emailAddress":"flast@redacted.com",         "displayName":"first last",         "active":true,         "timeZone":"Europe/London"      },      "customfield_12046":[           {              "self":"https://jira.redacted.com/rest/api/2/customFieldOption/12045",            "value":"diy",            "id":"12045"         }      ],   }
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

考虑到两个感兴趣的自定义字段,您可能最终会得到类似的结果,但如果您只需要名称,则可以进一步缩减结构。

type AutoGenerated struct {

    Fields struct {

        Customfield11343 struct {

            Self         string `json:"self"`

            Name         string `json:"name"`

            Key          string `json:"key"`

            EmailAddress string `json:"emailAddress"`

            DisplayName  string `json:"displayName"`

            Active       bool   `json:"active"`

            TimeZone     string `json:"timeZone"`

        } `json:"customfield_11343"`

        Customfield12046 []struct {

            Self  string `json:"self"`

            Value string `json:"value"`

            ID    string `json:"id"`

        } `json:"customfield_12046"`

    } `json:"fields"`

}

您得到的效果是,提要中的所有额外信息都被丢弃,但您可以非常干净地获得所需的数据。


查看完整回答
反对 回复 2023-07-10
?
翻阅古今

TA贡献1780条经验 获得超5个赞

这是一个困难的问题,因为第二个是数组形式。这使得使用地图变得困难。


对于第一个,使用起来很简单:


type JiraCustomField struct {

    Self         string `json:"self"`

    Name         string `json:"name"`

    Key          string `json:"key"`

    EmailAddress string `json:"emailAddress"`

    DisplayName  string `json:"displayName"`

    Active       bool   `json:"active"`

    TimeZone     string `json:"timeZone"`

}

type JiraPayload struct {

    Expand string                     `json:"expand"`

    ID     string                     `json:"id"`

    Key    string                     `json:"key"`

    Fields map[string]JiraCustomField `json:"fields"`

}

https://play.golang.org/p/y8-g6r0kInV

具体来说,这部分Fields map[string]JiraCustomField对于第二种情况,看起来您需要以数组形式(例如Fields map[string][]JiraCustomField.

在这种情况下,我认为您需要制作自己的解组器。

您可以使用自定义 Unmarshal/marshaler 执行的操作是使用 Reflection 包并检查它是数组还是结构。如果它是一个结构体,则将其放入数组中,并将其存储在Fields map[string][]JiraCustomField.


查看完整回答
反对 回复 2023-07-10
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

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