gpt4 book ai didi

json - 当给定的 JSON 值不是 JSON 对象时解码自定义结构

转载 作者:行者123 更新时间:2023-12-03 10:06:29 25 4
gpt4 key购买 nike

我定义了一个自定义结构,用于将 API 响应解码到其中。有时,当对象为空或缺失时,API 决定发送一个空字符串 ("")。我不清楚如何处理这种类型不匹配。我实际上有数百个这样的自定义结构(嵌套),如果它是空的,API 将为最顶层的父级执行此操作。如果有某种方法可以全局执行此操作而无需自定义 UnmarshalJSON 方法,那将是理想的选择。我正在使用代码生成,因此我可以轻松添加这些方法。

当我第一次尝试编写自己的自定义 UnmarshalJSON 时,我陷入了一个循环:

func (e MyStruct) UnmarshalJSON(b []byte) error {
t := MyStruct{}
if string(b) == `""` {e = t} else {
if err := json.Unmarshal(b, e); err != nil {
return fmt.Errorf("failed to parse nested structure: %v", err)
}
}
return nil
}

我明白为什么我最终会陷入循环,但我觉得我缺少更好的解决方案。

我在 Go Playground 中创建了一个示例。

https://play.golang.org/p/DrrFhA3TzPv

如果您正在寻找更多上下文,我当前生成的代码在这里:https://github.com/mbrancato/edgeos/blob/a8af9143aa82ddece27089bf2f543f473c97d2db/sdk/config.go

最佳答案

使用以下代码解码值。

var emptyString = []byte(`""`)

func (e *MyStruct) UnmarshalJSON(b []byte) error {
if bytes.Equal(b, emptyString) {
*e = MyStruct{}
return nil
}
type t MyStruct
if err := json.Unmarshal(b, (*t)(e)); err != nil {
return fmt.Errorf("failed to parse nested structure: %w", err)
}
return nil
}

注意事项:

  • UnmarshalJSON 必须在指针接收器上。
  • 通过声明与 MyStruct 具有相同基础类型的新类型 t 来避免递归。解码为 t 类型的值。
  • 比较字节而不是字符串以避免分配。
  • 允许使用错误。与调用者一样,使用 %w 作为错误的格式化动词。

关于json - 当给定的 JSON 值不是 JSON 对象时解码自定义结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66124289/

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