Go中如何定义合适的类型以正确反序列化指定JSON文件?
问题原因
你定义的反序列化目标类型为map[string][]string,要求所有键对应的值都必须是字符串切片类型,但你的JSON结构里Key1对应的值是普通字符串,类型不匹配,因此json.Unmarshal会自动跳过类型不匹配的Key1字段,仅能正常解析符合类型要求的Key2。
可行的两种定义方案
方案1:使用值类型为interface{}的map
如果你的JSON结构不固定,需要灵活接收不同类型的值,可以将map的值类型定义为任意类型interface{},取值时再做类型断言即可:
var data map[string]interface{} err := json.Unmarshal([]byte(file), &data) if err != nil { // 自行补充错误处理逻辑 } // 取值示例 key1, isStr := data["Key1"].(string) key2, isArr := data["Key2"].([]interface{}) // 如果需要取出Key2的字符串元素,可以遍历后再做类型断言
方案2:自定义结构体(更推荐)
如果JSON结构固定,优先使用结构体定义,类型安全不需要额外断言,解析性能也更高:
// 结构体字段首字母必须大写,否则json包无法访问私有字段 type CustomData struct { Key1 string `json:"Key1"` Key2 []string `json:"Key2"` } var data CustomData err := json.Unmarshal([]byte(file), &data) if err != nil { // 自行补充错误处理逻辑 } // 直接取值即可,不需要额外类型转换 // fmt.Println(data.Key1) // fmt.Println(data.Key2)
额外注意点
你提供的JSON示例存在两处不符合JSON规范的尾部逗号,实际使用时需要删除,否则会反序列化失败:
{ "Key1": "value1", "Key2": [ "value2", "value3" // 此处删除原有尾部逗号 ] // 此处删除原有尾部逗号 }
内容的提问来源于stack exchange,提问作者Yuhui Liu
相关产品推荐
相关产品推荐

