Skip to content

扩展概述 ​

json 库提供两类互补的扩展接口:Hook 钩子系统在操作流程中插入自定义逻辑,自定义编码决定类型编码为 JSON 时的形态。两者可独立使用,也可叠加——例如用钩子审计写操作、用 MarshalJSON 定制同一份数据的输出格式。

Hook 钩子系统 ​

Hook 拦截 Get/Set/Delete 全流程(含包级封装;Encode/Marshal 路径暂不触发),在操作前后各触发一次,适合日志、计时、输入校验与审计:

go
p, err := json.New()
if err != nil {
    panic(err)
}
defer p.Close()

// 运行期注册:一行接入日志钩子
p.AddHook(json.LoggingHook(slog.Default()))

注册途径有两种:装配期经 Config.Hooks 在构造时装载,或运行期经 Processor.AddHook 随时追加。除内置的 LoggingHook/TimingHook/ValidationHook/ErrorHook 工厂外,实现 Hook 接口即可完全自定义。

触发点细节、执行顺序与 panic 保护见 Hook 钩子系统。

自定义编码 ​

改变「某个类型编码成什么 JSON」有三条当前版本实际生效的通道:

通道适用场景
实现 json.Marshaler(MarshalJSON)类型完全决定自己的 JSON 形态
实现 encoding.TextMarshaler(MarshalText)以文本表达形态,编码为 JSON 字符串
Config.CustomEscapes全局改写某些字符的转义

Config.CustomEncoder 未挂接

Config.CustomEncoder 与 Config.CustomTypeEncoders 已声明但尚未接入编码流水线,当前设置不会改变输出;请先使用上表三条通道。

三条通道的完整示例与选型建议见自定义编码器。

相关 ​