Golang unmarshal数组没有键/值到stuct

时间:2017-03-20 23:54:25

标签: go

我正在尝试将json数组放入Google AnalyticsAPI的结构中。

EG:

"rows": [
    [
        "female",
        "18-24",
        "1308"
    ],
    [
        "female",
        "25-34",
        "741"
    ]
]

通常我有键/值所以我可以放json:"gender"但是没有关键的键,所以它会搜索的值发生变化。

结构将是:

type Row struct {
    Gender   string `json:"gender"`
    AgeRange string `json:"blah"`
    Count    string `json:"blah"`
}

如果我做len(jResp.Rows)我可以看到它抓住所有十二行/数组,但字段是空的。

1 个答案:

答案 0 :(得分:1)

我不认为有可能encoding/json直接将json解码为 首先在UnmarshalJSON上实现Row方法的结构 } type。

func (r *Row) UnmarshalJSON(data []byte) error {
     var s []string
     if err := json.Unmarshal(data, &s); err != nil {
          return err
     }
     if len(s) >= 3 {
         r.Gender = s[0]
         r.AgeRange = s[1]
         r.Count = s[2]
     }
     return nil
}

// make sure it's a slice of pointers to Row
type Resp struct {
    Rows []*Row `json:"rows"`
}

编辑:修改代码以使其实际编译。下面是一个有效的例子https://play.golang.org/p/eqVQj65xJv

您也可以先将数据解码为一段字符串,然后遍历结果以构建结构值。

type Resp struct {
    Rows [][]string `json:"rows"`
}

type Row struct {
    Gender   string `json:"gender"`
    AgeRange string `json:"blah"`
    Count    string `json:"blah"`
}

var resp jResp
if err := json.Unmarshal(data, &resp); err != nil {
    panic(err)
}

var rows = make([]Row, len(resp.Rows))
for i, r := range resp.Rows {
    rows[i] = Row{
        Gender: r[0],
        AgeRange: r[1],
        Count: r[2],
    }
}

修改:修复了这个问题。 https://play.golang.org/p/Otb7iULSh3