我正在尝试解码以下格式的 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/