Golang如何将JSON字符串数组反序列化为[]int64类型?
如何在Go中将JSON字符串数组编/解码为[]int64类型字段?
确实,Go标准库的encoding/json包提供的,string结构体标签用起来很顺手,能把像"309230"这样的字符串数字直接转成int64类型字段,比如:
type Demo struct { SingleInt int64 `json:",string"` }
但遗憾的是这个标签只支持单个值的类型(字符串、浮点数、整数、布尔),对[]int64这种切片类型完全不起作用。要实现JSON字符串数组和[]int64的互转,最靠谱的方式是自定义类型并实现JSON编解码接口。
具体实现步骤
首先,我们定义一个基于[]int64的自定义类型:
type Int64Slice []int64
然后给这个类型实现json.Unmarshaler接口,处理从JSON字符串数组到Int64Slice的解码:
import ( "encoding/json" "strconv" ) func (s *Int64Slice) UnmarshalJSON(data []byte) error { // 先把JSON数据解析成字符串切片 var strSlice []string if err := json.Unmarshal(data, &strSlice); err != nil { return err } // 遍历字符串切片,逐个转成int64 converted := make([]int64, len(strSlice)) for idx, str := range strSlice { num, err := strconv.ParseInt(str, 10, 64) if err != nil { return err } converted[idx] = num } *s = converted return nil }
如果需要把Int64Slice编码回JSON字符串数组,再实现json.Marshaler接口:
func (s Int64Slice) MarshalJSON() ([]byte, error) { // 把每个int64转成字符串 strSlice := make([]string, len(s)) for idx, num := range s { strSlice[idx] = strconv.FormatInt(num, 10) } // 将字符串切片编码为JSON return json.Marshal(strSlice) }
使用示例
现在你可以在结构体里直接用这个自定义类型了:
type MyData struct { Scores Int64Slice `json:"scores"` } // 解码测试 jsonInput := `{"scores": ["95", "88", "76"]}` var data MyData if err := json.Unmarshal([]byte(jsonInput), &data); err != nil { panic(err) } // 输出: [95 88 76] fmt.Println(data.Scores) // 编码测试 data.Scores = Int64Slice{90, 85, 92} jsonOutput, err := json.Marshal(data) if err != nil { panic(err) } // 输出: {"scores":["90","85","92"]} fmt.Println(string(jsonOutput))
补充说明
根据Go官方文档的描述:
"string"选项表示字段存储在JSON编码的字符串内。它只适用于字符串、浮点数、整数或布尔类型的字段。
这也解释了为什么,string标签对切片无效——它本来就没设计支持复合类型。而自定义编解码接口的方式完全不受这个限制,还能灵活处理各种边缘情况(比如非法数字字符串的错误处理)。
内容的提问来源于stack exchange,提问作者Vojtech Vitek - golang.cz
相关产品推荐
相关产品推荐

