亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 231 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號