首页 > 后端开发 > Golang > 在 `UnmarshalJSON` 中调用 `json.Unmarshal` 时如何避免堆栈溢出?

在 `UnmarshalJSON` 中调用 `json.Unmarshal` 时如何避免堆栈溢出?

Susan Sarandon
发布: 2024-12-25 19:18:16
原创
836 人浏览过

How to Avoid Stack Overflow When Calling `json.Unmarshal` Within `UnmarshalJSON`?

在 UnmarshalJSON 中调用 json.Unmarshal 而不会导致堆栈溢出

问题:
UnmarshalJSON 的自定义实现调用 json.Unmarshal 会导致堆栈

解决方案:

要避免在 UnmarshalJSON 中调用 json.Unmarshal 时出现堆栈溢出问题,请使用以下技术:

  1. 使用 type 关键字创建一个新类型,使其成为原始类型的包装器类型。
  2. 将原始值类型转换为包装类型的实例。
  3. 在包装类型对象上调用 json.Unmarshal 来执行解组。
  4. 解组后,对原件执行任何自定义后处理type.

推理:

使用 type 关键字创建新类型会有效地删除原始类型中的所有方法。当在解组过程中使用包装器类型时,JSON 解码器将找不到自定义的 UnmarshalJSON 实现,并将使用默认的实现。这可以防止堆栈溢出问题。

示例:

考虑带有 Age 字段的 Person 类型:

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func (p *Person) UnmarshalJSON(data []byte) error {
    type personWrapper Person
    if err := json.Unmarshal(data, (*personWrapper)(p)); err != nil {
        return err
    }

    // Post-processing after unmarshaling:
    if p.Age < 0 {
        p.Age = 0
    }
    return nil
}
登录后复制

此技术允许自定义解组后进行后处理,同时避免与调用 json.Unmarshal 相关的堆栈溢出问题解组JSON。

以上是在 `UnmarshalJSON` 中调用 `json.Unmarshal` 时如何避免堆栈溢出?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板