2 回答
TA贡献1851条经验 获得超5个赞
对解组方法使用指针接收器。如果使用值接收器,则在方法返回时对接收器的更改将丢失。
unmarshal 方法的参数是 JSON 文本。解组 JSON 文本以获得删除所有 JSON 引用的纯字符串。
func (intValue *PersonID) UnmarshalJSON(data []byte) error {
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
*intValue = Lookup(s)
return nil
}
JSON 标记与示例 JSON 之间存在不匹配。我更改了 JSON 以匹配标签,但您可以通过其他方式更改它。
if err := json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil {
playground example
TA贡献1799条经验 获得超9个赞
这是基于我的评论的答案。我不确定这正是您想要做的,因为您的一些问题措辞让我感到困惑,但基本思想是将解组和转换分成两个不同的步骤。首先将原始数据解组为兼容类型,然后转换为另一种类型或丰富您已经拥有的类型,如下例所示。欢迎您在自定义实现中隐藏此行为UnmarshalJSON如果你愿意,但我个人建议不要这样做。这是我的两个原因;1) 它只是与 Go 的显式冗长编码风格不一致 2) 我鄙视高度混淆的包/库/语言,它们为你做这样的事情,因为迟早它会咬你的屁股,比添加 1 花费更多在几个地方有一行额外的代码(比如几个小时试图调试对你来说毫无意义的东西)。
type MyType struct {
Id PersonID
Name string `json: "name"`
Count int `json: "count"`
Greeting string `json: "greeting"`
}
func main() {
var m MyType
if err := json.Unmarshal([]byte(`{"name": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil {
fmt.Println(err)
} else {
m.Id = Lookup(m.Name) // see this isn't unmarshalling
// better to take the data as is and do transformation separate
for i := 0; i < m.Count; i++ {
fmt.Println(m.Greeting, m.Person.Name())
}
}
}
- 2 回答
- 0 关注
- 172 浏览
添加回答
举报