Go如何使用Unmarshal解析含字符串与整数混合类型无键数组的JSON数据
Go解析混合类型嵌套JSON数组的正确实现
问题核心
你遇到的问题根因是JSON中a字段的子数组包含两种不同类型的元素:第一个为字符串、第二个为整数,Go是静态类型语言,直接声明[][]string类型无法兼容整数,会导致数值丢失。
方案1:使用空接口实现快速解析
如果不需要严格的类型校验,直接将a字段声明为[][]interface{}类型,解析后通过类型断言获取对应值即可:
package main import ( "encoding/json" "fmt" ) type StructJson struct { A [][]interface{} `json:"a"` } func main() { XJson := ` { "a": [ ["aaa",15], ["bbb",11] ] }` var output StructJson err := json.Unmarshal([]byte(XJson), &output) if err != nil { fmt.Println("解析错误:", err) return } fmt.Println(output) // 取值示例 for _, item := range output.A { strVal := item[0].(string) numVal := item[1].(float64) // json解析数字默认是float64类型,如需int可强转 fmt.Printf("字符串:%s,数值:%d\n", strVal, int(numVal)) } }
方案2:自定义反序列化接口(类型安全,推荐)
如果明确子数组固定为「字符串+整数」的结构,可自定义结构体实现json.Unmarshaler接口,代码更健壮,避免频繁类型断言:
package main import ( "encoding/json" "fmt" ) // 自定义子元素结构体,对应每个二维数组的子项 type ArrayItem struct { Str string Num int } // 实现json.Unmarshaler接口 func (ai *ArrayItem) UnmarshalJSON(data []byte) error { var tmp []interface{} if err := json.Unmarshal(data, &tmp); err != nil { return err } // 类型转换 ai.Str = tmp[0].(string) ai.Num = int(tmp[1].(float64)) return nil } type StructJson struct { A []ArrayItem `json:"a"` } func main() { XJson := ` { "a": [ ["aaa",15], ["bbb",11] ] }` var output StructJson err := json.Unmarshal([]byte(XJson), &output) if err != nil { fmt.Println("解析错误:", err) return } // 直接使用类型明确的字段,无需断言 fmt.Println(output) for _, item := range output.A { fmt.Printf("字符串:%s,数值:%d\n", item.Str, item.Num) } }
运行上述代码可以得到正确的解析结果,不会丢失整数数据。
内容的提问来源于stack exchange,提问作者ekomonimo
相关产品推荐
相关产品推荐

