在Go 中使用匿名成員扁平化編組JSON 結構
在以下程式碼中:
<code class="go">type Anything interface{} type Hateoas struct { Anything Links map[string]string `json:"_links"` } func MarshalHateoas(subject interface{}) ([]byte, error) { h := &Hateoas{subject, make(map[string]string)} switch s := subject.(type) { case *User: h.Links["self"] = fmt.Sprintf("http://user/%d", s.Id) case *Session: h.Links["self"] = fmt.Sprintf("http://session/%d", s.Id) } return json.MarshalIndent(h, "", " ") }</code>
目標是以扁平化匿名成員的方式編組JSON。預設情況下,匿名成員在 JSON 輸出中被視為單獨的命名欄位。
解決方案是使用 Reflect 套件手動將我們希望序列化的結構體的欄位對應到映射[字串]介面{}。透過這種方式,我們可以保留原始結構體的扁平結構,而無需引入新的欄位。
這是完成此操作的程式碼:
<code class="go">func MarshalHateoas(subject interface{}) ([]byte, error) { links := make(map[string]string) out := make(map[string]interface{}) subjectValue := reflect.Indirect(reflect.ValueOf(subject)) subjectType := subjectValue.Type() for i := 0; i < subjectType.NumField(); i++ { field := subjectType.Field(i) name := subjectType.Field(i).Name out[field.Tag.Get("json")] = subjectValue.FieldByName(name).Interface() } switch s := subject.(type) { case *User: links["self"] = fmt.Sprintf("http://user/%d", s.Id) case *Session: links["self"] = fmt.Sprintf("http://session/%d", s.Id) } out["_links"] = links return json.MarshalIndent(out, "", " ") }</code>
此程式碼迭代結構體的字段,檢索它們的值,並使用字段的JSON 標記作為鍵將它們添加到輸出映射中。此程序可確保匿名成員的欄位被平鋪到輸出映射中。
透過以這種方式自訂 JSON 編組過程,我們可以實現所需的 JSON 輸出,同時保持介面提供的靈活性和類型安全性。
以上是如何使用匿名成員扁平化 Go 中的編組 JSON 結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!