使用任意键/值对解组 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中文网其他相关文章!