转到结构 JSON 数组的数组

我在尝试从特定的请求响应映射一些数据时遇到问题,因为在serialLabels内部:有没有属性名称(int,字符串)的数据,所以我对如何映射该数据感到困惑:


这是服务响应:


{

"data": {

    "seriesLabels": [

        [

            0,

            "(none)"

        ],

        [

            0,

            "Cerveza"

        ],

        [

            0,

            "Cigarros"

        ],

        [

            0,

            "Tecate"

        ],

        [

            0,

            "Cafe"

        ],

        [

            0,

            "Amstel"

        ],

        [

            0,

            "Leche"

        ],

        [

            0,

            "Ultra"

        ],

        [

            0,

            "Coca cola"

        ],

        [

            0,

            "Agua"

        ]

    ]

}

}

我去图表结构映射该信息是:


type PopularWord struct {

    Data *Data `json:"data"`

}


type Data struct {

    SeriesLabels []*SeriesLabels `json:"seriesLabels"`

}


type SeriesLabels struct {

    value int32  `json:""`

    name  string `json:""`

}

我做错了什么?声明结构的正确方法是什么?


月关宝盒
浏览 113回答 2
2回答

慕妹3146593

seriesLabels是一个 JSON 数组,其元素也是 JSON 数组。要解析数组的 JSON 数组,您可以在 Go 中使用切片:type Data struct {    SeriesLabels [][]interface{}}测试它:var pw *PopularWordif err := json.Unmarshal([]byte(src), &pw); err != nil {    panic(err)}fmt.Println(pw)for _, sl := range pw.Data.SeriesLabels {    fmt.Println(sl)}输出(在Go游乐场上尝试):&{0xc000120108}[0 (none)][0 Cerveza][0 Cigarros][0 Tecate][0 Cafe][0 Amstel][0 Leche][0 Ultra][0 Coca cola][0 Agua]要将内部数组作为结构值获取,您可以实现自定义取消封接:type Data struct {    SeriesLabels []*SeriesLabels `json:"seriesLabels"`}type SeriesLabels struct {    value int32     name  string}func (sl *SeriesLabels) UnmarshalJSON(p []byte) error {    var s []interface{}    if err := json.Unmarshal(p, &s); err != nil {        return err    }    if len(s) > 0 {        if f, ok := s[0].(float64); ok {            sl.value = int32(f)        }    }    if len(s) > 1 {        if s, ok := s[1].(string); ok {            sl.name = s        }    }    return nil}测试代码是相同的,输出(在Go Playground上尝试这个):&{0xc0000aa0f0}&{0 (none)}&{0 Cerveza}&{0 Cigarros}&{0 Tecate}&{0 Cafe}&{0 Amstel}&{0 Leche}&{0 Ultra}&{0 Coca cola}&{0 Agua}

紫衣仙女

问题在于,在 JSON 中将其表示为数组。如果要使用 ,则必须实现取消marshaler接口对其进行解码(否则它只会接受JSON对象)。SeriesLabelsencoding/json幸运的是,代码很简单:func (s *SeriesLabels) UnmarshalJSON(d []byte) error {    arr := []interface{}{&s.value, &s.name}    return json.Unmarshal(d, &arr)}请注意,此代码将忽略无效输入(数组太长或类型不正确)。根据您的需要,您可能希望在调用后添加检查,以确保数组长度和内容(指针)未更改。json.Unmarshal还有其他用于 Go 的 JSON 解析库可以使其不那么麻烦,例如 gojay。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go