为了账号安全,请及时绑定邮箱和手机立即绑定

如何将具有动态字段的 JSON 对象映射到 Go 结构体

如何将具有动态字段的 JSON 对象映射到 Go 结构体

Go
红糖糍粑 2021-09-10 10:10:08
我正在使用 Go 开发一个网站并将其连接到 Elastic Search。在弹性搜索中,我可以拥有索引类型的动态字段。当我从 Elastic Search 读取文档时,它会返回一个 JSON 对象作为结果,其中可以包含具有动态名称的字段(或用户定义的字段)。我可以获取 JSON 结果并将其解组为 Go 结构,但我不知道将这些动态字段保留为 Go 结构一部分的最佳方法是什么。这就是我正在做的。例如,如果我从 Elastic Search 获取联系人的文档,它可能如下所示:{     "EmailAddress": "test@test.com",   "Name": "Test Contact",   "Phone": "17894785236",   "City": "San Francisco",   "State": "California"}用于 Contact 的 Go 结构是:type Contact struct {    EmailAddress            string    Name                    string    Phone                   string    CustomFields            map[string]interface{}}我实现了Marshaler和Unmarshaler来覆盖对象的编组和解组方式。func (c *Contact) MarshalJSON() ([]byte, error) {    contactMap := make(map[string]interface{})    contactMap["EmailAddress"] = c.EmailAddress    contactMap["Name"] = c.Name    contactMap["Phone"] = c.Phone    for k, v := range c.CustomFields {        contactMap[k] = v    }    return json.Marshal(contactMap)}func (c *Contact) UnmarshalJSON(data []byte) error {    var contactMap map[string]interface{}    if c == nil {        return errors.New("RawString: UnmarshalJSON on nil pointer")    }    if err := json.Unmarshal(data, &contactMap); err != nil {        return err    }    c.EmailAddress = contactMap["EmailAddress"].(string)    c.Name = contactMap["Name"].(string)    c.Phone = contactMap["Phone"].(string)    for key, val := range contactMap {        if key != "EmailAddress" && key != "Name" && Key != "Phone" {            c.CustomFields[key] = value        }    }    return nil}这是最好的方法吗?你会推荐什么?
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 252 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信