首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组数组

数组数组
EN

Stack Overflow用户
提问于 2021-08-03 17:13:28
回答 2查看 819关注 0票数 0

我在试图映射来自特定请求响应的一些数据时遇到了问题,因为在seriesLabels中有一些没有属性名的数据(int,string),所以我很困惑如何映射这些数据:

这是服务响应:

代码语言:javascript
复制
{
"data": {
    "seriesLabels": [
        [
            0,
            "(none)"
        ],
        [
            0,
            "Cerveza"
        ],
        [
            0,
            "Cigarros"
        ],
        [
            0,
            "Tecate"
        ],
        [
            0,
            "Cafe"
        ],
        [
            0,
            "Amstel"
        ],
        [
            0,
            "Leche"
        ],
        [
            0,
            "Ultra"
        ],
        [
            0,
            "Coca cola"
        ],
        [
            0,
            "Agua"
        ]
    ]
}
}

我要映射这些信息的结构是:

代码语言:javascript
复制
type PopularWord struct {
    Data *Data `json:"data"`
}

type Data struct {
    SeriesLabels []*SeriesLabels `json:"seriesLabels"`
}

type SeriesLabels struct {
    value int32  `json:""`
    name  string `json:""`
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-03 17:25:52

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

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

代码语言:javascript
复制
type Data struct {
    SeriesLabels [][]interface{}
}

测试它:

代码语言:javascript
复制
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)
}

输出(在围棋游乐场上尝试):

代码语言:javascript
复制
&{0xc000120108}
[0 (none)]
[0 Cerveza]
[0 Cigarros]
[0 Tecate]
[0 Cafe]
[0 Amstel]
[0 Leche]
[0 Ultra]
[0 Coca cola]
[0 Agua]

要将内部数组作为struct值获取,可以实现自定义解封送处理:

代码语言:javascript
复制
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
}

测试代码是相同的,输出(在围棋游乐场上尝试这个):

代码语言:javascript
复制
&{0xc0000aa0f0}
&{0 (none)}
&{0 Cerveza}
&{0 Cigarros}
&{0 Tecate}
&{0 Cafe}
&{0 Amstel}
&{0 Leche}
&{0 Ultra}
&{0 Coca cola}
&{0 Agua}
票数 2
EN

Stack Overflow用户

发布于 2021-08-03 17:25:44

问题是SeriesLabels是用JSON表示为数组的。如果您想使用encoding/json,您必须实现解编组器接口来解码它(否则它将只接受JSON对象)。

幸运的是,代码很简单:

代码语言:javascript
复制
func (s *SeriesLabels) UnmarshalJSON(d []byte) error {
    arr := []interface{}{&s.value, &s.name}
    return json.Unmarshal(d, &arr)
}

请注意,此代码忽略无效输入(数组太长或类型不正确)。根据您的需要,您可能希望在调用json.Unmarshal之后添加对数组长度和内容(指针)没有更改的检查。

还有其他用于Go的JSON解析库,它们可以使这一点更简单一些,比如戈杰伊

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68640253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档