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

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

Barbara Streisand
发布: 2024-10-29 05:41:02
原创
692 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板