gpt4 book ai didi

JSON Unmarshal 不规则的 JSON 字段

转载 作者:数据小太阳 更新时间:2023-10-29 03:24:27 25 4
gpt4 key购买 nike

我有这个代码:

type Response struct {
ID string `json:"id"`
Tags Tags `json:"tags,omitempty"`
}

type Tags struct {
Geo []string `json:"geo,omitempty"`
Keyword []string `json:"keyword,omitempty"`
Storm []string `json:"storm,omitempty"`
}

func (t *Tags) UnmarshalJSON(b []byte) (err error) {
str := string(b)
if str == "" {
t = &Tags{}
return nil
}

err = json.Unmarshal(b, t)
if err != nil {
return err
}

return nil
}

现在,我的 JSON 响应如下所示:

[{
"id": "/cms/v4/assets/en_US",
"doc": [{
"id": "af02b41d-c2c5-48ec-9dbc-ceed693bdbac",
"tags": {
"geo": [
"DMA:US.740:US"
]
}
},
{
"id": "6a90d9ed-7978-4c18-8e36-c01cf4260492",
"tags": ""
},
{
"id": "32cfd045-98ac-408c-b464-c74e02466339",
"tags": {
"storm": [
"HARVEY - AL092017"
],
"keyword": [
"hurrcane",
"wunderground"
]
}
}
]
}]

我最好更改 JSON 响应以使其正确完成,但我做不到。解码继续出错(goroutine 堆栈超过 1000000000 字节限制)。最好,我宁愿使用 easyjson 来做到这一点或 ffjson但怀疑这是可能的。有什么建议吗?

最佳答案

您的 UnmarshalJSON 函数递归调用自身,这将导致堆栈的大小爆炸。

func (t *Tags) UnmarshalJSON(b []byte) (err error) {
str := string(b)
if str == "" {
t = &Tags{}
return nil
}

err = json.Unmarshal(b, t) <--- here it calls itself again
if err != nil {
return err
}

return nil
}

如果您有理由从 UnmarshalJSON 函数中调用 json.Unmarshal,它必须是不同的类型。一种常见的方法是使用本地别名:

    type tagsAlias Tags
var ta = &tagsAlias
err = json.Unmarshal(b, ta)
if err != nil {
return err
}

*t = Tags(ta)

另请注意,t = &Tags{} 在您的函数中不执行任何操作;它为 t 分配了一个新值,但是一旦函数退出,该值就会丢失。如果你真的要赋值给t,你需要*t;但您也根本不需要它,除非您试图取消设置先前设置的 *Tags 实例。

关于JSON Unmarshal 不规则的 JSON 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45870273/

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