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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:26:42