使用任意鍵/值對解組JSON 到結構
問題
您有一個包含已知和未知欄位組合的JSON 字串。您需要解析此 JSON 並將已知欄位對應到結構體,同時保留未知欄位。
解決方案1:雙重Unmarshal
type KnownFields struct { Known1 string Known2 string } type Message struct { Known1 string `json:"known1"` Known2 string `json:"known2"` Unknowns map[string]interface{} `json:"-"` } func ParseMessage(jsonStr string) (*Message, error) { var knownFields KnownFields if err := json.Unmarshal([]byte(jsonStr), &knownFields); err != nil { return nil, err } var m map[string]interface{} if err := json.Unmarshal([]byte(jsonStr), &m); err != nil { return nil, err } delete(m, "known1") delete(m, "known2") return &Message{ Known1: knownFields.Known1, Known2: knownFields.Known2, Unknowns: m, }, nil }
解決方案2:直接解組到Map[string] 介面{}
type Message map[string]interface{} func ParseMessage(jsonStr string) (*Message, error) { var m Message if err := json.Unmarshal([]byte(jsonStr), &m); err != nil { return nil, err } return &m, nil }
附加選項:解組到介面{}
func ParseMessage(jsonStr string) (interface{}, error) { var m interface{} if err := json.Unmarshal([]byte(jsonStr), &m); err != nil { return nil, err } return m, nil }
之間的選擇這些選項取決於您的特定要求。解決方案 1 提供了一種結構化的 Message 類型,可以清楚地區分已知欄位和未知欄位。解決方案 2 提供了更靈活的方法,讓您以地圖的形式存取所有欄位。解決方案 3 提供了一種將 JSON 解組為非類型化介面的簡化方法,然後您可以根據需要進行處理。
以上是如何在 Go 中將具有任意鍵/值對的 JSON 解組到結構體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!