gpt4 book ai didi

go - 如何在不导致堆栈溢出的情况下在 UnmarshalJSON 中调用 json.Unmarshal?

转载 作者:IT王子 更新时间:2023-10-29 01:50:40 26 4
gpt4 key购买 nike

如何在结构中创建方法 UnmarshalJSON,在内部使用 json.Unmarshal 而不会导致堆栈溢出?

package xapo

type Xapo struct {}

func (x Xapo) UnmarshalJSON(data []byte) error {
err := json.Unmarshal(data, &x)
if err != nil {
return err
}
fmt.Println("done!")
return nil
}

有人能解释一下为什么会发生堆栈溢出吗?能修好吗?

提前致谢。

最佳答案

看起来您可能正在尝试使用默认解码器进行自定义解码,然后对数据进行后处理。但是,正如您所发现的,尝试此操作的明显方法会导致无限循环!

通常的解决方法是使用您的类型创建一个新类型,在新类型的实例上使用默认的解码器,对数据进行后处理,最后转换为原始类型并分配回目标实例。请注意,您需要在指针类型上实现 UnmarshalJSON。

例如:

func (x *Xapo) UnmarshalJSON(data []byte) error {
// Create a new type from the target type to avoid recursion.
type Xapo2 Xapo

// Unmarshal into an instance of the new type.
var x2 Xapo2
err := json.Unmarshal(data, &x2)
if err != nil {
return err
}

// Perform post-processing here.
// TODO

// Cast the new type instance to the original type and assign.
*x = Xapo(x2)
return nil
}

关于go - 如何在不导致堆栈溢出的情况下在 UnmarshalJSON 中调用 json.Unmarshal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52433467/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com