Go语言 marshal和unmarshal时动态更改json键

2hh7jdfx  于 2023-11-14  发布在  Go
关注(0)|答案(2)|浏览(145)

我被迫使用一个API,它对同一个对象有两个不同的键或标识符,VAT - number。
在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和VatIdentifier。
问题是,它会给已经很复杂的代码增加额外的复杂性。
所以我想知道:
有没有一种方法(类似反射)可以根据情况改变结构中Vat字段的JSON键?

flmtquvp

flmtquvp1#

不能在运行时修改类型定义,包括结构标记。
只要字段类型和顺序(即内存布局)相同,您根本不需要任何转换函数,它们可以直接转换: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}

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

bvuwiixz

bvuwiixz2#

你也可以在同一个结构中同时使用这两个字段,并为它们赋相同的值。目标API可以选择使用其中一个字段而忽略另一个字段。

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

字符串

相关问题