json.Marshal返回空字符串或错误主因是结构体字段未导出(首字母小写),需大写字段名并用json:"key,omitempty"标签;null处理需用*string等指针或sql.NullString;json.RawMessage用于延迟解析;自定义time.Time类型实现MarshalJSON/UnmarshalJSON以支持ISO8601格式。

为什么 json.Marshal 会返回空字符串或错误?
常见原因是结构体字段未导出(首字母小写),json 包无法访问私有字段,序列化结果为 {} 或跳过该字段。
- 确保结构体字段首字母大写(如
Name而非name) - 若需自定义 JSON 字段名,用结构体标签:
json:"user_name,omitempty" -
omitempty表示值为零值(""、0、false、nil)时忽略该字段 - 嵌套结构体中任一字段不可导出,整个嵌套对象可能为空(不是报错,而是静默丢弃)
如何处理 JSON 中的空字符串、null 和缺失字段?
Go 的 json.Unmarshal 对 null 的处理取决于目标类型的可空性。原生类型(如 string、int)无法表示 null,反序列化时若遇到 null 会报错 json: cannot unmarshal null into Go value。
- 用指针类型接收可选字段:
*string、*int——null会被转为nil - 用
sql.NullString等标准空值包装器(需实现UnmarshalJSON) - 自定义类型可实现
UnmarshalJSON([]byte) error方法,统一处理null/ 空字符串 / 缺失 - 对 map 类型,
null会解为nil;对 slice,同理
json.RawMessage 适合什么场景?
当你需要延迟解析某段 JSON(比如字段结构不确定、或想避免重复解析)、或透传未知结构(如 webhook payload 中的 data 字段),json.RawMessage 是最轻量的选择 —— 它只是字节切片的别名,不触发解析开销。
- 声明字段类型为
json.RawMessage,反序列化时原样拷贝原始 JSON 字节 - 后续按需调用
json.Unmarshal解析它,支持多次解析不同结构 - 注意:不能直接打印或比较
json.RawMessage值,它是[]byte,需转string才可读 - 若字段可能为
null,建议用*json.RawMessage,否则null会导致解析失败
type Event struct {
ID int `json:"id"`
Type string `json:"type"`
Data json.RawMessage `json:"data"`
}
var e Event
json.Unmarshal([]byte(`{"id":1,"type":"user","data":{"name":"alice"}}`), &e)
// 此时 e.Data == []byte(`{"name":"alice"}`)
var user struct{ Name string }
json.Unmarshal(e.Data, &user) // 按需解析
时间字段序列化成 ISO8601 格式失败怎么办?
Go 默认将 time.Time 序列化为 Go 内部格式(类似 "2006-01-02T15:04:05.999999999Z07:00"),但多数 API 要求 ISO8601(如 "2024-05-20T08:30:00Z")。直接用 time.Time 无法控制格式。
1、数据调用该功能使界面与程序分离实施变得更加容易,美工无需任何编程基础即可完成数据调用操作。2、交互设计该功能可以方便的为栏目提供个性化性息功能及交互功能,为产品栏目添加产品颜色尺寸等属性或简单的留言和订单功能无需另外开发模块。3、静态生成触发式静态生成。4、友好URL设置网页路径变得更加友好5、多语言设计1)UTF8国际编码; 2)理论上可以承担一个任意多语言的网站版本。6、缓存机制减轻服务器
立即学习“go语言免费学习笔记(深入)”;
- 定义自定义类型并实现
MarshalJSON和UnmarshalJSON - 在
MarshalJSON中调用t.Format(time.RFC3339) - 在
UnmarshalJSON中用time.Parse(time.RFC3339, s),注意处理带毫秒和不带毫秒的变体 - 避免在结构体中混用原生
time.Time和自定义时间类型,容易漏处理
字段级控制比全局设置更可靠,因为不同接口对时间精度要求可能不同。









