英文:
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
,其中包含字段A
和B
,以及一个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 UnmarshalJSON
method 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
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论