在Go 中使用動態金鑰解析YAML
使用可能因使用者定義的API 版本而異的金鑰解析YAML 檔案時會出現此問題。使用者可以根據需要省略或安排版本(例如,V0、V2、V5)。
具有環境結構的原始方法
最初的方法是將 YAML 解析為環境結構。然而,解析資料的實際類型是map[string]Environment。
<code class="go">type Environment struct { SkipHeaderValidation bool `yaml:"skip-header-validation"` Version map[string]MajorVersion }</code>
要解決這個問題,我們需要一個自訂的Unmarshaler。
環境的自訂Unmarshaler
我們為環境類型建立一個自訂的Unmarshaler 方法,用於解析靜態和動態
<code class="go">func (e *Environment) UnmarshalYAML(unmarshal func(interface{}) error) error { var params struct { SkipHeaderValidation bool `yaml:"skip-header-validation"` } if err := unmarshal(&params); err != nil { return err } var versions map[string]MajorVersion if err := unmarshal(&versions); err != nil { // Expect error here due to boolean to MajorVersion conversion if _, ok := err.(*yaml.TypeError); !ok { return err } } e.SkipHeaderValidation = params.SkipHeaderValidation e.Versions = versions return nil }</code>
修改解析和輸出
我們現在可以修改解析程式碼來處理動態鍵並最終返回所需的資料結構。
修改後的主程式函數
<code class="go">func main() { var e map[string]Environment if err := yaml.Unmarshal([]byte(data), &e); err != nil { fmt.Println(err.Error()) } fmt.Printf("%#v\n", e) }</code>
輸出
輸出現在將反映預期的資料結構以及對應解析的動態鍵。
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, }, }, }, }
以上是如何使用自訂解組器在 Go 中解析具有動態鍵的 YAML?的詳細內容。更多資訊請關注PHP中文網其他相關文章!