在Go 中解組JSON,無需雙重解組
在Go 中,可能會遇到需要將JSON 解析為各種結構的情況,但會發生雙重解組,導致冗餘。本文提出了一種解決方案,涉及部分解組資料以避免第二個解組步驟。
理解問題
當嘗試將 JSON 解析為已知結構時,一個常見的問題是方法是:
解決方案
我們可以將其解組為json.RawMessage,而不是將值強制轉換為interface{}。這會部分解組數據,並允許隨後根據鍵值解組到特定結構。
範例程式碼
import ( "encoding/json" "fmt" ) type Ping struct { Ping string `json:"ping"` } type Ack struct { Messages []Message `json:"messages"` } type Message string func main() { testJSON := []byte(`{"ack":{"messages":["Hi there","Hi again"]}}`) var myAck = Ack{} var myMap map[string]json.RawMessage err := json.Unmarshal(testJSON, &myMap) if err != nil { fmt.Println("error unmarshalling: ", err) } jsonAck, ok := myMap["ack"] if !ok { fmt.Println("key 'ack' not found") return } err = json.Unmarshal(jsonAck, &myAck) if err != nil { fmt.Println("unmarshal error", err) } else { fmt.Println("New ack object: ", myAck) } }
在此修改後的程式碼中,我們取代了映射[string]interface{} 與 map[string]json.RawMessage。處理「ack」鍵時,我們直接解組到 Ack 結構,從而無需雙重解組。
以上是在 Go 中解析 JSON 時如何避免雙重解組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!