登录
首页 >  Golang >  Go问答

json.Unmarshal 到具有自定义类型的映射与到结构或切片的行为不一致

来源:stackoverflow

时间:2024-03-23 12:24:33 403浏览 收藏

在 Go 中,使用 `json.Unmarshal` 将 JSON 解组到自定义类型时,针对映射的行为与结构或切片不同。当解组到结构或切片时,实现 `json.Unmarshaler` 即可正常工作。然而,当解组到包含自定义类型的映射时,必须实现 `encoding.TextUnmarshaler` 才能正确处理。这种差异源于 Go 解码器优先使用 `encoding.TextUnmarshaler`,而对于映射,`encoding.TextUnmarshaler` 是必不可少的,即使存在 `json.Unmarshaler`。

问题内容

我有一个自定义类型,它应该是一个枚举器,并且它实现了 json.Unmarshaler。

当我解组为这种类型的切片结构时,它可以工作,例如https://go.dev/play/p/DGg3nzo_VwN p>

当我解组到包含此类型的地图时,它会中断,例如 https://go.dev/play/p/YGgnRvr0agz

爬过源代码(go 1.18),我知道如何使其工作,只需实现 encoding.TextUnmarshaler,如 https://go.dev/play/p/vY4E4snAY52 并且我还了解了代码的工作原理对于地图:它检查是否实现了 encoding.TextUnmarshaler,如果是,则在尝试 UnmarshalText 之前调用其 UnmarshalJSON。换句话说,UnmarshalText 必须存在,但如果 UnmarshalJSON 也存在,它将被忽略。

为什么会有这样的优先级?为什么只有地图才这样处理?


正确答案


来自 go 的 decoder

// Map key must either have string kind, have an integer kind,
// or be an encoding.TextUnmarshaler.

因此您必须实现 textunmarshaller。

终于介绍完啦!小伙伴们,这篇关于《json.Unmarshal 到具有自定义类型的映射与到结构或切片的行为不一致》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>