首页 >后端开发 >Golang >如何在 Go 中将具有任意键/值对的 JSON 解组到结构体?

如何在 Go 中将具有任意键/值对的 JSON 解组到结构体?

Barbara Streisand
Barbara Streisand原创
2024-10-29 05:41:02705浏览

How to Unmarshal JSON with Arbitrary Key/Value Pairs to a Struct in Go?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn