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

转到结构 JSON 数组的数组

转到结构 JSON 数组的数组

Go
月关宝盒 2022-09-19 10:42:43
我在尝试从特定的请求响应映射一些数据时遇到问题,因为在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:""`}我做错了什么?声明结构的正确方法是什么?
查看完整描述

2 回答

?
慕妹3146593

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

seriesLabels是一个 JSON 数组,其元素也是 JSON 数组。


要解析数组的 JSON 数组,您可以在 Go 中使用切片:


type Data struct {

    SeriesLabels [][]interface{}

}

测试它:


var pw *PopularWord

if 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}



查看完整回答
反对 回复 2022-09-19
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

问题在于,在 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。


查看完整回答
反对 回复 2022-09-19
  • 2 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

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