Go语言JSON反序列化报错‘Json tag but not exported’解决方案咨询
解决Go中JSON反序列化"Json tag but not exported"错误及代码优化方案
嘿,刚学Go就踩了JSON反序列化的坑很正常,我来帮你一步步捋清楚问题根源,以及怎么彻底解决它。
首先,你遇到的Json tag but not exported错误,核心原因很明确:Go的encoding/json包只能处理「导出字段」——也就是结构体里首字母大写的字段。你的代码里time结构体的所有字段都是小写(比如id、currentDateTime),这些属于未导出字段,JSON解析器没有权限访问它们,自然就报错了。
接下来咱们拆解你代码里的几个关键问题:
1. 结构体设计的核心问题
- 你嵌套了一个未导出的
time结构体到Time里,不仅内部字段全是小写未导出,就连这个嵌套的time字段本身也是小写(type Time struct { time }),这意味着JSON解析器连这个嵌套字段都看不到。 - 字段的JSON tag里多了多余的
,string选项,比如json:"currentDateTime,string",这个选项是用来把JSON字符串转成数值类型的,但你的currentDateTime本身就是字符串类型,加这个反而会导致解析失败。
2. 方法逻辑的问题
Timenow方法里,你把JSON反序列化到了临时变量resultJson,而不是传入的result参数,等于做了无用功,最后返回的result还是空的。GetTime方法里初始化的result是空值,调用Timenow也没正确赋值,最后返回的结果自然没有数据。
修正后的完整代码
package main import ( "encoding/json" "fmt" "net/http" ) // 直接使用导出的结构体,去掉冗余的嵌套未导出结构 type Time struct { ID string `json:"$id"` CurrentDateTime string `json:"currentDateTime"` UtcOffset float64 `json:"utcOffset"` IsDayLightSavingsTime bool `json:"isDayLightSavingsTime"` DayOfTheWeek string `json:"dayOfTheWeek"` TimeZoneName string `json:"timeZoneName"` CurrentFileTime float64 `json:"currentFileTime"` OrdinalDate string `json:"ordinalDate"` ServiceResponse string `json:"serviceResponse"` } // 简化GetTime方法,直接处理请求并返回结果 func (t *Time) GetTime() (*Time, error) { res, err := http.Get("http://worldclockapi.com/api/json/utc/now") if err != nil { return nil, fmt.Errorf("无法获取JSON数据: %w", err) } defer res.Body.Close() // 提前声明defer,避免资源泄漏 var timeData Time // 直接用Decoder解析响应体,比先读字节更高效 err = json.NewDecoder(res.Body).Decode(&timeData) if err != nil { return nil, fmt.Errorf("无法解析JSON数据: %w", err) } return &timeData, nil } func main() { var a Time t, err := a.GetTime() if err != nil { fmt.Println("错误:", err) return } fmt.Printf("获取到的时间数据:\n%+v\n", t) }
关键改动说明
- 导出结构体字段:把所有字段的首字母改成大写(比如
id→ID),同时保留正确的JSON tag(去掉多余的,string),让JSON解析器能正常访问这些字段。 - 简化结构设计:去掉了原来嵌套的未导出
time结构体,直接用一个导出的Time结构体,逻辑更清晰。 - 优化解析流程:用
json.NewDecoder(res.Body).Decode()替代先读字节再Unmarshal的方式,更高效还能避免资源泄漏。 - 修正方法逻辑:
GetTime直接处理HTTP请求并解析到目标结构体,返回正确的数据,同时用fmt.Errorf包装错误,保留错误链,方便后续排查问题。
现在运行代码,就能正常获取并解析JSON数据了,再也不会出现"Json tag but not exported"的错误啦。
内容的提问来源于stack exchange,提问作者frostrock
相关产品推荐
相关产品推荐

