首頁  >  文章  >  後端開發  >  如何使用 Go 扁平化 JSON 中的嵌入式匿名結構?

如何使用 Go 扁平化 JSON 中的嵌入式匿名結構?

Linda Hamilton
Linda Hamilton原創
2024-10-31 01:00:29987瀏覽

How to Flatten Embedded Anonymous Structs in JSON with Go?

使用Go 展平JSON 中的嵌入匿名結構

在提供的程式碼中,MarshalHateoas 函數以以下方式展平結構體的JSON 表示:嵌入匿名結構作為Hateoas 結構的成員。但是,匿名成員的字段被視為單獨的命名字段,從而導致不良的 JSON 輸出。

要解決此問題,可以利用 Reflect 套件循環嵌入結構的欄位並手動將它們映射到扁平化表示。這是MarshalHateoas 的修改版本:

<code class="go">import (
    "encoding/json"
    "fmt"
    "reflect"
)

// ...

func MarshalHateoas(subject interface{}) ([]byte, error) {
    links := make(map[string]string)

    // Retrieve the unexported fields of the subject struct
    subjectValue := reflect.Indirect(reflect.ValueOf(subject))
    subjectType := subjectValue.Type()

    // Iterate over the fields of the embedded anonymous struct
    for i := 0; i < subjectType.NumField(); i++ {
        field := subjectType.Field(i)
        name := subjectType.Field(i).Name
        jsonFieldName := field.Tag.Get("json")

        // Exclude fields with "-" JSON tag
        if jsonFieldName == "-" {
            continue
        }

        // Add field values to the flattened map
        links[jsonFieldName] = subjectValue.FieldByName(name).Interface().(string)
    }

    // Return the JSON-encoded map
    return json.MarshalIndent(links, "", "    ")
}</code>

透過動態建構的映射取代匿名成員,MarshalHateoas 函數現在可以正確地展平JSON 輸出:

<code class="json">{
    "id": 123,
    "name": "James Dean",
    "_links": {
        "self": "http://user/123"
    }
}</code>

此解決方案允許從具有嵌入匿名成員的結構建立扁平化JSON 表示,無需引入新欄位或依賴特定於平台或依賴庫的技巧。

以上是如何使用 Go 扁平化 JSON 中的嵌入式匿名結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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