登录
首页 >  Golang >  Go问答

改变 JSON 键名时实现动态的序列化和反序列化

来源:stackoverflow

时间:2024-02-06 13:30:24 324浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《改变 JSON 键名时实现动态的序列化和反序列化》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我被迫使用一个 API,该 API 对于同一对象(增值税号)有两个不同的密钥或标识符。取决于调用的是 GET 还是 POST/PATCH

在 GET 中,我必须使用此结构对 json 进行解组/解码:

type SilverfinCompany struct {
    ID                     int    `json:"id"`
    Name                   string `json:"name"`
    Vat                    string `json:"vat"` // here
}

在 POST 和 PATCH 中,我可以使用此结构将数据编组为 json:

type SilverfinCompany struct {
    ID                     int    `json:"id"`
    Name                   string `json:"name"`
    Vat                    string `json:"vat_identifier"` // here
}

显而易见的解决方案是拥有两个内容相同但 JSON 键略有不同的“不同”结构,以及两个转换函数。或者在结构中有两个不同的字段:Vat 和 VatIndentifier。

问题在于,它会给已经很复杂的代码增加额外的复杂性。

所以我想知道:

有没有办法(类似反射)根据情况改变结构中 Vat 字段的 JSON 键?


正确答案


您无法在运行时修改类型定义,包括结构标记。

只要字段类型和顺序(即内存布局)相同,就根本不需要任何转换函数,它们可以直接转换:https://go.dev/play/p/IhkVM-BMLiY

func main() {
    foo := SilverfinCompanyFoo{
        ID:   1,
        Name: "Baz",
        Vat:  "Qux",
    }

    bar := SilverfinCompanyBar(foo)
    fmt.Println(bar)
}

type SilverfinCompanyFoo struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Vat  string `json:"vat"` // here
}

type SilverfinCompanyBar struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Vat  string `json:"vat_identifier"` // here
}

// {1 Baz Qux}

这是此类场景的常见解决方案。

到这里,我们也就讲完了《改变 JSON 键名时实现动态的序列化和反序列化》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>