Golang程序JSON值解析失败求助(附示例代码)
解决Go语言JSON解析失败的问题
嘿,我一眼就看出你代码里的问题啦——这是Go中JSON解析的经典坑:结构体字段的可见性!
问题根源
Go语言的encoding/json包只能处理首字母大写的导出字段,因为小写开头的字段属于包内私有,标准库的json包根本没法访问到它们。你定义的ValidateUser结构体里,status是小写开头,所以json.Unmarshal完全不会给这个字段赋值,自然也就没法检查它的取值了。
另外,虽然你的JSON里UserName是大写开头,刚好和结构体字段名匹配,但为了更严谨(比如JSON键和结构体字段名不一致的情况),最好给结构体字段加上json标签明确映射关系。
修正后的代码
package main import ( "encoding/json" "fmt" ) // 修正结构体:字段首字母大写导出,添加json标签映射JSON键 type ValidateUser struct { UserName string `json:"UserName"` Status string `json:"status"` SessionID string `json:"sessionID"` Timestamp string `json:"timestamp"` } func main() { B := "{\"UserName\": \"Moulali\",\"status\": \"valid_user\"}" fmt.Println("outside if") fmt.Printf("ValueOfB = %v\n", B) // 这里修正了printf的用法,避免格式串直接输出 bytes := []byte(B) var validateUser ValidateUser // 一定要检查Unmarshal的错误! err := json.Unmarshal(bytes, &validateUser) if err != nil { fmt.Printf("JSON解析失败: %v\n", err) return } // 现在可以正常访问Status字段了 fmt.Printf("解析后的Status: %s\n", validateUser.Status) if validateUser.Status == "valid_user" { fmt.Println("用户状态有效") } else { fmt.Println("用户状态无效") } }
额外提示
- 永远不要忽略
json.Unmarshal的返回错误,它能帮你快速定位JSON格式错误、字段类型不匹配等问题。 - 结构体字段的
json标签是可选的,但当JSON键和结构体字段名(大小写、命名风格)不一致时,必须用标签指定映射,比如JSON里是session_id,结构体字段是SessionID,就需要写json:"session_id"。
内容的提问来源于stack exchange,提问作者Moulali
相关产品推荐
相关产品推荐

