關於將具有未知/任意鍵/值對的JSON 解組到結構中,已經提出了許多類似的問題。然而,找到的解決方案都沒有提供簡單而優雅的方法來實現這一點。
我們有一個 JSON 字串,其中包含已知欄位(始終存在)和未知數量的未知/任意欄位。範例:
<code class="json">{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}</code>
在此範例中,known1 和known2 是已知字段,而unknown1 和unknown2 是任意字段。未知欄位可以有任何名稱(鍵)和值(字串、布林、float64 或 int)。
我們的目標是找到一種慣用的方法將此類 JSON 訊息解析為結構。
我們可以定義以下結構:
<code class="go">type Message struct { Known1 string `json:"known1"` Known2 string `json:"known2"` Unknowns []map[string]interface{} }</code>
使用此結構,範例JSON 訊息應產生以下結果:
{Known1:foo Known2:bar Unknowns:[map[unknown1:car] map[unknown2:1]]}
另一個選項是將JSON 解組到映射[string]介面{}:
<code class="go">import ( "encoding/json" "fmt" ) func main() { jsonMsg := `{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}` var msg map[string]interface{} fmt.Println(json.Unmarshal([]byte(jsonMsg), &msg)) fmt.Printf("%+v", msg) }</code>
這將產生:
<nil> map[known1:foo known2:bar unknown1:car unknown2:1]
的優點這種方法是我們可以迭代鍵和值並執行必要的類型斷言來處理資料。根據我們的需要,我們可能會也可能不會用資料填充結構。
以上是如何將帶有任意鍵/值對的 JSON 解組到 Go 中的結構中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!