JSON 在 go 中将相同的结构编组/解组为不同的 JSON 格式?

我有一个结构,我想根据上下文以不同的方式将其编组为 JSON。


例如,有时我想这样编组:


    type MyStruct struct {

        Nickname       string `json:"nickname"`

        EmailAddress   string `json:"email_address"`

        PhoneNumber    string `json:"-"`

        MailingAddress string `json:"-"`

    }

有时我想这样编组:


    type MyStruct struct {

        Nickname       string `json:"nickname"`

        EmailAddress   string `json:"email_address"`

        PhoneNumber    string `json:"phone_number"`

        MailingAddress string `json:"mailing_address"`

    }

有没有一种简单的方法可以做到这一点:

  1. 制作 2 个独立的结构。

  2. 编写自定义编组器。

  3. 暂时删除 PhoneNumber 和 MailingAddress 的字符串值(在标签上省略),编组然后将它们添加回来。

如果只有一种方法可以:

  1. 指定 2 组标签并告诉封送拆收器使用哪些标签。

  2. 在运行时动态更改标签。


忽然笑
浏览 209回答 2
2回答

慕码人8056858

您可以使用反射,这不是最有效的解决方案,但它很方便。func MarshalSubset(obj interface{}, fields ...string) ([]byte, error) {    if len(fields) == 0 {        return json.Marshal(obj)    }    out := make(map[string]interface{}, len(fields))    val := reflect.ValueOf(obj)    if val.Kind() == reflect.Ptr {        val = val.Elem()    }    if val.Kind() != reflect.Struct {        panic("not a struct")    }    typ := val.Type()    for _, f := range fields {        val := val.FieldByName(f).Interface()        rfld, _ := typ.FieldByName(f)        tag := strings.Split(rfld.Tag.Get("json"), ",")        if len(tag) > 0 {            f = tag[0]        }        out[f] = val    }    return json.Marshal(out)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go