在Golang中反序列化带有模式的字段

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

Deserialize patterned fields In Golang

问题

我正在编写与某些 JSON 结构兼容的 Golang 结构体。然而,大部分字段都是已知的,但在 JSON 定义中会有一些遵循特定模式(例如 "x-{randomName}")的字段,我也希望将其反序列化为特定字段的 map[string]interface{}

有没有一种好的方法来实现这个?

英文:

I am writing golang struct, which are compatible with some json structure. However, those most of the fields are know, there will be few fields following some specific patterns(like "x-{randomName}") in the json definition, which I also want to get deserialized to a certain field as map[string]interface{} as well.

Is there any descent way to achieve it?

答案1

得分: 1

这段代码的作用是将JSON数据解析为Go语言的结构体。为了避免手动映射字段,可以进行两次解析。第一次解析将所有正确标记的字段放入结构体中,然后再解析一次将剩余的字段放入map[string]interface{}中。如果不关心重复的字段,甚至不需要过滤第二个map。

甚至可以在UnmarshalJSON方法中自动填充结构体。

代码示例中定义了一个结构体S,其中包含字段AB,以及一个map[string]interface{}类型的字段All

UnmarshalJSON方法用于解析JSON数据。在方法中,首先创建了一个新类型ss,用于隐藏UnmarshalJSON方法,以避免无限递归。然后使用json.Unmarshal将JSON数据解析为结构体s。接着,再次使用json.Unmarshal将JSON数据解析为All字段的map类型。最后,返回解析过程中的错误。

你可以在这个链接上查看代码示例:http://play.golang.org/p/VBVlRjNlHy

英文:

It's less efficient, but you could unmarshal twice to avoid manually mapping the fields. Once to put all the properly tagged fields into the struct, and then again into a map[string]interface{} to get everything else. If you don't care about the duplicate fields, you don't even need to filter the second map.

You can even do this in an UnmarshalJSONmethod to automatically populate the struct

type S struct {
	A   string `json:"a"`
	B   string `json:"b"`
	All map[string]interface{}
}

func (s *S) UnmarshalJSON(b []byte) error {
	// create a new type to hide the UnmarshalJSON method
	// otherwise we'll recurse indefinitely.
	type ss S

	err := json.Unmarshal(b, (*ss)(s))
	if err != nil {
		return err
	}
	// now unmarshal again into the All map
	err = json.Unmarshal(b, &s.All)
	if err != nil {
		return err
	}

	return nil
}

http://play.golang.org/p/VBVlRjNlHy

huangapple
  • 本文由 发表于 2016年1月30日 03:20:58
  • 转载请务必保留本文链接:https://go.coder-hub.com/35092395.html
匿名

发表评论

匿名网友

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

确定