gpt4 book ai didi

json - 解码动态 JSON,忽略已知字段

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

我正在尝试解码以下格式的 JSON:

{
"fixedString": {
"uselessStuff": {},
"alsoUseless": {},

"dynamicField": [
{ "name": "jack" }
],
"dynamicToo": [
{ "name": "jill" }
]
}
}

我想删除字段“uselessStuff”和“alsoUseless”,并获得其他所有内容。其他键是用户定义的,可以采用任何值

我可以使用自定义 UnmarshalJSON(基于 this answer )删除不需要的字段,但我觉得这不必要地复杂:

package main

import (
"encoding/json"
"fmt"
)

type Response struct {
Things map[string]interface{} `json:"fixedString"`
}

type _R Response

func (f *Response) UnmarshalJSON(bs []byte) (err error) {
foo := _R{}

if err = json.Unmarshal(bs, &foo); err == nil {
*f = Response(foo)
}

delete(f.Things, "uselessStuff")
delete(f.Things, "alsoUseless")

return err
}

func main() {
j := []byte(`{ "fixedString": { "uselessStuff": {}, "alsoUseless": {}, "dynamicField": [ { "name": "jack" } ], "dynamicToo": [ { "name": "jill" } ] } }`)

var r Response
err := json.Unmarshal(j, &r)
if err != nil {
panic(err.Error())
}

for x, y := range r.Things {
fmt.Println(x, y)
}
}

有没有办法使用注释忽略这两个键,而不是在自定义 UnmarshalJSON 函数中删除它们(并且必须添加额外的类型别名 _R 以避免堆栈溢出)?

最佳答案

您可以从 map 中删除“uselessStuff”和“alsoUseless”,并将它们用作结构中的未导出(小写)字段。很可能不是interface{}

json 包忽略未导出的字段

type Response struct {
Things map[string]interface{} `json:"fixedString"`
uselessStuff interface{}
alsoUseless interface{}
}

关于json - 解码动态 JSON,忽略已知字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50988388/

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