在 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中文网其他相关文章!