使用Golang 在YAML 中進行動態金鑰解析
簡介
簡介YAML不是)標記語言)是一種廣泛使用的資料序列化格式,允許靈活的資料表示。然而,在 Go 中解析具有動態鍵(即可能變化的鍵)的 YAML 檔案會帶來挑戰,因為該語言嚴重依賴靜態類型結構。
問題描述您有一個 YAML 文件,其中金鑰代表不同的版本(例如 V1、V2、V3)。使用者可以指定他們支援哪些版本,並且密鑰可能不按順序或跳過版本。您想要將此 YAML 檔案解析為 Go 結構體,但該結構體的欄位必須與動態鍵相符。
不正確的方法最初,您嘗試解析 YAML檔案放入環境結構中,期望鍵存在於根層級。然而,根元素的實際類型是字串(代表環境名稱)到環境結構的映射。
解要使用動態鍵解析 YAML,您需要需要在結構上使用自訂 UnmarshalYAML 方法來解析鍵並建構正確的結構。在這種情況下,Environment 結構需要 UnmarshalYAML 方法將根解組為映射,然後解析各個環境。
程式碼範例<code class="go">func (e *Environment) UnmarshalYAML(unmarshal func(interface{}) error) error { var params struct { SkipHeaderValidation bool `yaml:"skip-header-validation"` } if err := unmarshal(¶ms); err != nil { return err } var versions map[string]MajorVersion if err := unmarshal(&versions); err != nil { // Here we expect an error because a boolean cannot be converted to a MajorVersion if _, ok := err.(*yaml.TypeError); !ok { return err } } e.SkipHeaderValidation = params.SkipHeaderValidation e.Versions = versions return nil }</code>這裡是一個範例環境結構的自訂 UnmarshalYAML 方法:
此方法先解組布林欄位。然後,它嘗試將其餘資料解組到版本名稱到 MajorVersion 結構的映射中。但是,由於未編組的資料是布林值和 MajorVersion 結構的混合,因此將引發 yaml.TypeError 。程式碼會忽略此錯誤,並將未編組的版本對應指派給環境結構的 Versions 欄位。
範例用法<code class="go">var e map[string]Environment if err := yaml.Unmarshal([]byte(data), &e); err != nil { fmt.Println(err.Error()) } fmt.Printf("%#v\n", e)</code>使用自訂UnmarshalYAML 方法,您可以現在正確解組YAML 資料:
map[string]main.Environment{ "development": { SkipHeaderValidation: true, Versions: { "V2": { Current: "2.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: false, SkipMimeTypeValidation: false, }, "V1": { Current: "1.0.0", MimeTypes: {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"}, SkipVersionValidation: true, SkipMimeTypeValidation: true, }, }, }, }這將產生以下輸出: 這示範如何成功將具有動態鍵的YAML 檔案解析為Go 結構。
以上是如何在 Go 中使用動態鍵解析 YAML?的詳細內容。更多資訊請關注PHP中文網其他相關文章!