Unmarshal dynamic json content in Go

huangapple go评论75阅读模式
英文:

Unmarshal dynamic json content in Go

问题

我有一个动态的 JSON 对象,我想在我的 Go 应用程序中进行解组。问题是,JSON 的某些部分是动态命名的,所以我不知道应该在结构类型的 JSON 标签中放什么。为了说明我的问题,请参考这个 playground:https://play.golang.org/p/q8J0VVO7uj

如你所见,s1 可以完美地解组,因为结构类型确实有 description 标签。但是 s2 无法解组。

所以我的问题是:我该如何解决这个问题?我能在这里使用接口吗?

英文:

I have a dynamic json object which I want to unmarshal in my Go app. The problem is that some parts of the json are dynamically named, so I don't know what to put in the struc type json tags. To illustrate my problem, please see this playground: https://play.golang.org/p/q8J0VVO7uj

As you can see the s1 can perfectly be unmarshalled, because the struct type indeed has tag description. But s2 cannot be unmarshalled.

So my question is: how can I solve this? Can I make use of interfaces here?

答案1

得分: 1

使用映射(map)来处理动态键:

type ElvisEvent struct {
    Timestamp int64  `json:"timestamp"`
    Type      string `json:"type"`
    AssetID   string `json:"assetId"`
    Metadata  struct {
    } `json:"metadata"`

    ChangedMetadata map[string]struct {
        OldValue interface{} `json:"oldValue"`
        NewValue interface{} `json:"newValue"`
    } `json:"changedMetadata"`
}

playground 示例

英文:

Use a map for dynamic keys:

type ElvisEvent struct {
	Timestamp int64  `json:"timestamp"`
	Type      string `json:"type"`
	AssetID   string `json:"assetId"`
	Metadata  struct {
	} `json:"metadata"`

	ChangedMetadata map[string]struct {
		OldValue interface{} `json:"oldValue"`
		NewValue interface{} `json:"newValue"`
	} `json:"changedMetadata"`
}

playground example

huangapple
  • 本文由 发表于 2017年7月14日 22:38:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/45105654.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定