我正在使用 Go 開發(fā)一個網(wǎng)站并將其連接到 Elastic Search。在彈性搜索中,我可以擁有索引類型的動態(tài)字段。當(dāng)我從 Elastic Search 讀取文檔時,它會返回一個 JSON 對象作為結(jié)果,其中可以包含具有動態(tài)名稱的字段(或用戶定義的字段)。我可以獲取 JSON 結(jié)果并將其解組為 Go 結(jié)構(gòu),但我不知道將這些動態(tài)字段保留為 Go 結(jié)構(gòu)一部分的最佳方法是什么。這就是我正在做的。例如,如果我從 Elastic Search 獲取聯(lián)系人的文檔,它可能如下所示:{ "EmailAddress": "test@test.com", "Name": "Test Contact", "Phone": "17894785236", "City": "San Francisco", "State": "California"}用于 Contact 的 Go 結(jié)構(gòu)是:type Contact struct { EmailAddress string Name string Phone string CustomFields map[string]interface{}}我實現(xiàn)了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 回答
- 0 關(guān)注
- 277 瀏覽
添加回答
舉報
0/150
提交
取消