Go语言如何正确反序列化包含Unicode特殊字符键的JSON数据
问题解决方法
根因说明
Go标准库encoding/json反序列化结构体时,要求结构体字段的json tag和JSON响应中的键完全字节匹配,出现你遇到的问题,90%以上的情况是你写在tag里的"Pass ✔"和实际JSON响应中的键存在肉眼不可查的差异:比如对勾符号的Unicode编码不同、键前后存在不可见零宽字符、空格是全角空格等。你原来的结构体字段Pass首字母大写是符合json库访问要求的,问题仅出在tag匹配环节。
解决步骤
- 第一步:先确认实际JSON响应的键的准确内容
先把响应反序列化到一个临时map,打印出所有键的准确值:
var tempMap map[string]interface{} err := json.Unmarshal(body, &tempMap) if err != nil { panic(err) } // 遍历打印所有键,复制你需要的键的准确值 for k := range tempMap { fmt.Printf("准确键值:%q\n", k) }
- 第二步:两种方案任选其一解决
方案1:直接替换结构体tag
把上一步打印出来的准确的键值,直接复制替换你结构体的json tag即可,修改后代码如下:
type Status struct { Pass bool `json:"这里粘贴你上一步复制到的准确键,比如打印出来的Pass ✔"` } // 其余逻辑不变 var s Status json.Unmarshal(body, &s) fmt.Println(s.Pass) // 即可输出正确的true
方案2:用map中转(无需纠结tag匹配)
如果不想处理tag匹配问题,直接用map接收后再赋值给对应字段:
type Status struct { Pass bool } // 反序列化逻辑 var temp map[string]bool err := json.Unmarshal(body, &temp) if err != nil { // 自行补充错误处理逻辑 } var s Status s.Pass = temp["这里填你第一步拿到的准确键"] fmt.Println(s.Pass) // 输出正确的true
内容的提问来源于stack exchange,提问作者LJC
相关产品推荐
相关产品推荐

