将JSON数组解组为JSON对象

harpratap:

我必须解组一系列Json对象,但是其中一个对象包含一个json数组,该数组的结构不是很好。

"labels": [
    {
      "key": "owner",
      "value": "harry"
    },
    {
      "key": "group",
      "value": "student"
    }
  ]

我正在使用此结构将其拆组-

type StudentDetails struct {
Id        string         `json:"id"`
Name      string         `json:"name"`
Labels    []Label   `json:"labels,omitempty"`
}
type Label struct {
Key string `json:"key"`
Value string `json:"value"`
}

我必须在for循环内使用x.Labels [0] .key ==“ owner”访问它,这很烦人。我想能够做x.Labels.Owner ==“ harry”代替。我该如何实现这一目标?使用默认的unmarshal函数可以很好地解组JSON的其余部分,因此我认为编写自定义函数不是一个好选择。

拉兹:

有了这里的约束,这几乎与您将得到的(在操场上跑步)差不多

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    j := `
        {
            "id": "42",
            "name": "Marvin",
            "labels": [
                {
                    "key": "owner",
                    "value": "harry"
                },
                {
                    "key": "group",
                    "value": "student"
                }
            ]
        }`

    d := StudentDetails{}
    err := json.Unmarshal([]byte(j), &d)
    if err != nil {
        panic(err)
    }
    fmt.Println(d.Labels["owner"])
    fmt.Println(d.Labels["group"])
}

type StudentDetails struct {
    Id     string `json:"id"`
    Name   string `json:"name"`
    Labels Labels `json:"labels"`
}

type Labels map[string]string

func (l *Labels) UnmarshalJSON(b []byte) error {
    a := []map[string]string{}
    err := json.Unmarshal(b, &a)
    if err != nil {
        return err
    }

    t := map[string]string{}
    for _, m := range a {
        t[m["key"]] = m["value"]
    }
    *l = t
    return nil
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章