gpt4 book ai didi

JSON 将整数字段解码为字符串

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

我正在努力将整数反序列化为字符串结构字段。struct 字段是一个字符串,预计可以从我的图书馆的用户那里分配。这就是为什么我希望它是一个字符串,因为为了将它写入数据库,我实际上并不关心其中的值。用户可以提供文本,但有些只分配整数。

考虑这个结构:

type Test struct {
Foo string
}

有时我会得到一个有效的 JSON 值,但不会反序列化到结构中,因为 Foo 字段是整数而不是字符串:

{ "foo": "1" } // works
{ "foo": 1 } // doesn't

json.Unmarshal 将因以下错误而崩溃:json:无法将数字解码到 Go 结构字段 test.Foo 中,类型为字符串

查看复制:https://play.golang.org/p/4Qau3umaVm

现在,在我到目前为止工作过的所有其他 JSON 库(其他语言)中,如果目标字段是一个字符串并且您得到一个整数,那么反序列化器通常会将 int 包装在一个字符串中并完成它。这在 Go 中可以实现吗?

因为我无法真正控制数据的输入方式,所以我需要让 json.Unmarshal 对此不敏感 - 另一个解决方案是将 Foo 定义为 interface{} code> 这不必要地使我的代码与类型断言等复杂化。

关于如何做到这一点有什么想法吗?我基本上需要 json:",string"

的逆

最佳答案

要处理大型结构,您可以使用嵌入。

已更新为不丢弃可能先前设置的字段值。

func (t *T) UnmarshalJSON(d []byte) error {
type T2 T // create new type with same structure as T but without its method set!
x := struct{
T2 // embed
Foo json.Number `json:"foo"`
}{T2: T2(*t)} // don't forget this, if you do and 't' already has some fields set you would lose them

if err := json.Unmarshal(d, &x); err != nil {
return err
}
*t = T(x.T2)
t.Foo = x.Foo.String()
return nil
}

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

关于JSON 将整数字段解码为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45968476/

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