Golang:JSON:如何将字符串数组解组为[] int64

Vojtech Vitek:

Golang encoding/json套件可让您使用,stringstruct标记,以将字串值(例如"309230"编组/解编到int64栏位。例:

Int64String int64 `json:",string"`

但是,这不适用于切片,即。[]int64

Int64Slice []int64 `json:",string"` // Doesn't work.

有什么方法可以将JSON字符串数组编组/解编为[] int64字段?


引用https://golang.org/pkg/encoding/json

“字符串”选项表示字段在JSON编码的字符串中存储为JSON。它仅适用于字符串,浮点数,整数或布尔类型的字段。与JavaScript程序通信时,有时会使用这种额外的编码级别:

Vojtech Vitek:

对于感兴趣的任何人,我都找到了一种使用定义了MarshalJSON()UnmarshalJSON()方法的自定义类型的解决方案

type Int64StringSlice []int64

func (slice Int64StringSlice) MarshalJSON() ([]byte, error) {
    values := make([]string, len(slice))
    for i, value := range []int64(slice) {
        values[i] = fmt.Sprintf(`"%v"`, value)
    }

    return []byte(fmt.Sprintf("[%v]", strings.Join(values, ","))), nil
}

func (slice *Int64StringSlice) UnmarshalJSON(b []byte) error {
    // Try array of strings first.
    var values []string
    err := json.Unmarshal(b, &values)
    if err != nil {
        // Fall back to array of integers:
        var values []int64
        if err := json.Unmarshal(b, &values); err != nil {
            return err
        }
        *slice = values
        return nil
    }
    *slice = make([]int64, len(values))
    for i, value := range values {
        value, err := strconv.ParseInt(value, 10, 64)
        if err != nil {
            return err
        }
        (*slice)[i] = value
    }
    return nil
}

上面的解决方案将编组[]int64为JSON字符串数组。取消编组可从JSON字符串和整数数组进行,即:

{"bars": ["1729382256910270462", "309286902808622", "23"]}

{"bars": [1729382256910270462, 309286902808622, 23]}

参见https://play.golang.org/p/BOqUBGR3DXm上的示例

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章