You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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("用户状态无效")
    }
}

额外提示

  1. 永远不要忽略json.Unmarshal的返回错误,它能帮你快速定位JSON格式错误、字段类型不匹配等问题。
  2. 结构体字段的json标签是可选的,但当JSON键和结构体字段名(大小写、命名风格)不一致时,必须用标签指定映射,比如JSON里是session_id,结构体字段是SessionID,就需要写json:"session_id"。

内容的提问来源于stack exchange,提问作者Moulali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:54:03