首页 >后端开发 >Golang >在 UnmarshalJSON 中使用 json.Unmarshal 时如何防止堆栈溢出错误?

在 UnmarshalJSON 中使用 json.Unmarshal 时如何防止堆栈溢出错误?

Susan Sarandon
Susan Sarandon原创
2024-12-19 18:36:10961浏览

How to Prevent Stack Overflow Errors When Using json.Unmarshal within UnmarshalJSON?

在 UnmarshalJSON 中调用 json.Unmarshal 时避免堆栈溢出

在自定义 UnmarshalJSON 实现中调用 json.Unmarshal(b, type) 可能会导致导致堆栈溢出错误。出现这种情况是因为 JSON 解码器反复尝试查找该类型的自定义 UnmarshalJSON 实现,从而导致无限循环。

解决方案:创建新类型

避免这个问题,使用 type 关键字创建一个新类型。这个新类型不会继承原始类型的方法,包括 UnmarshalJSON。

type person2 Person

用法:

使用 a 将原始类型的值转换为新类型类型转换:

if err := json.Unmarshal(data, (*person2)(p)); err != nil {
    return err
}

示例:

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

func (p *Person) UnmarshalJSON(data []byte) error {
    type person2 Person
    if err := json.Unmarshal(data, (*person2)(p)); err != nil {
        return err
    }
    // Custom processing
    if p.Age < 0 {
        p.Age = 0
    }
    return nil
}

好处:

  • 防止堆栈溢出
  • 不会产生运行时开销,因为底层表示仍然存在不变

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn