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

标签 json go unmarshalling

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

相关文章:

arrays - 转到 : How to read the contents of two files and concatenate to a string

php - unmarshalItem DynamoDB 和 PHP 不工作

ajax - d3.js 差异图表示例如何处理 json 数据?

go - 如何更有效地返回数组

go - 如何将可变参数传递给另一个函数

json - 如何使用键值结构数组解码 JSON,其中键没有 json 标记

java - JAXB2注释: troubles rendering a value in a list

c# - 当字符串以 Json.Net 中的数字开头时如何处理从字符串到枚举的转换

ASP.NET MVC : How to call custom Html Helper from a controller method?

php - 拉YouTube观看次数