为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
忽然笑 2021-08-23 15:47:27
我有一个结构,我想根据上下文以不同的方式将其编组为 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"`    }有没有一种简单的方法可以做到这一点:制作 2 个独立的结构。编写自定义编组器。暂时删除 PhoneNumber 和 MailingAddress 的字符串值(在标签上省略),编组然后将它们添加回来。如果只有一种方法可以:指定 2 组标签并告诉封送拆收器使用哪些标签。在运行时动态更改标签。
查看完整描述

2 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

您可以使用反射,这不是最有效的解决方案,但它很方便。


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)

}


查看完整回答
反对 回复 2021-08-23
  • 2 回答
  • 0 关注
  • 208 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信