首頁  >  文章  >  後端開發  >  如何在 Go 中將動態 Viper 或 JSON 鍵解組為結構欄位?

如何在 Go 中將動態 Viper 或 JSON 鍵解組為結構欄位?

Barbara Streisand
Barbara Streisand原創
2024-11-20 15:30:13438瀏覽

How to Unmarshal Dynamic Viper or JSON Keys as Struct Fields in Go?

在 Go 中將動態 Viper 或 JSON 鍵解組為結構欄位

在 Go 中,處理結構欄位中的動態 JSON 鍵可能具有挑戰性。讓我們深入研究這個問題,並使用 Viper 函式庫提供一個全面的解決方案。

問題陳述

考慮一個有動態鍵的JSON 設定檔:

{
  "things" :{
    "123abc" :{
      "key1": "anything",
      "key2" : "more"
    },
    "456xyz" :{
      "key1": "anything2",
      "key2" : "more2"
    },
    "blah" :{
      "key1": "anything3",
      "key2" : "more3"
    }
  }
}

要將這個設定解析為結構體,可以設定這個設定檔定義:

type Thing struct {
  Name string  `?????`
  Key1 string  `json:"key2"`
  Key2 string  `json:"key2"`
}

但是,問題出現了:如何將動態鍵解組為結構體欄位名稱?

解決方案

要處理動態鍵,請考慮使用映射:

type X struct {
    Things map[string]Thing
}

type Thing struct {
    Key1 string
    Key2 string
}

解組如下:

var x X
if err := json.Unmarshal(data, &x); err != nil {
    // handle error
}

Playground 範例

如果鍵必須是結構體的成員,則可以在解組後使用循環添加它:

type Thing struct {
    Name string `json:"-"` // Add the field
    Key1 string
    Key2 string
}

...

// Fix the name field after unmarshal
for k, t := range x.Things {
    t.Name = k
    x.Things[k] = t
}

Playground 範例

使用這些技術,您可以有效地將動態JSON 鍵解組到Go 中的結構欄位中,即使使用像Viper 這樣的函式庫也是如此。

以上是如何在 Go 中將動態 Viper 或 JSON 鍵解組為結構欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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