首頁  >  文章  >  後端開發  >  如何使用匿名成員扁平化 Go 中的編組 JSON 結構?

如何使用匿名成員扁平化 Go 中的編組 JSON 結構?

Susan Sarandon
Susan Sarandon原創
2024-11-02 18:21:30414瀏覽

How to flatten Marshalled JSON Structs in Go with anonymous members?

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn