第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

編組類型時如何將方法結(jié)果嵌入到 JSON 輸出中?

編組類型時如何將方法結(jié)果嵌入到 JSON 輸出中?

Go
縹緲止盈 2021-10-04 18:16:05
我正在尋找一種干凈的方法來將方法的返回值嵌入到類型/值的 JSON 編組中。如果我不需要編寫自定義 JSON marshaller,那就太好了。例如,如果用戶類型具有FirstName與LastName字段和FullName()方法,我怎樣才能容易地嵌入一個full_name字段到JSON輸出? type User struct {     FirstName string `json:"first_name"`     LastName  string `json:"last_name"` } func (u User) FullName() string {     return fmt.Sprintf("%s %s", u.FirstName, u.LastName) }預(yù)期的 JSON: {     "first_name": "John",     "last_name":  "Smith",     "full_name":  "John Smith" }
查看完整描述

3 回答

?
智慧大石

TA貢獻1946條經(jīng)驗 獲得超3個贊

如果不提供一些編組器,這將無法輕松處理。我知道您不想MarshalJSON手動編寫并完成所有操作,但是您可以嘗試在自定義編組器中擴展您的結(jié)構(gòu),而不是依賴默認編組器。概念證明:


type User struct {

    FirstName string `json:"first_name"`

    LastName  string `json:"last_name"`

}


func (u *User) FullName() string {

    return fmt.Sprintf("%s %s", u.FirstName, u.LastName)

}


func (u User) MarshalJSON() ([]byte, error) {

    type rawUser User // raw struct, without methods (and marshaller)       

    // Marshal rawUser with an extension

    return json.Marshal(struct {

        rawUser

        FullName string `json:"full_name"`

    }{rawUser(u), u.FullName()})

}


您需要強制User轉(zhuǎn)換rawUser為刪除所有方法 - 否則您將無限循環(huán)MarshalJSON. 此外,我選擇MarshalJSON對副本而不是指針進行操作,以確保json.Marshal(user)產(chǎn)生與json.Marshal(&user).


這不是單行代碼,而是隱藏了標準接口背后的復(fù)雜性,因此您無需記住有一種特殊的非標準方式將您的結(jié)構(gòu)轉(zhuǎn)換為 JSON。


查看完整回答
反對 回復(fù) 2021-10-04
?
陪伴而非守候

TA貢獻1757條經(jīng)驗 獲得超8個贊

您可以創(chuàng)建一個新類型并將其編碼為 JSON。如果包含 type 的匿名字段*User,則兩者合并:


type UserForJSON struct {

    *User

    FullName string `json:"full_name"`

}


func NewUserForJSON(u *User) *UserForJSON {

    return &UserForJSON{u, u.FullName()}

}


func main() {

    u := &User{"John", "Smith"}

    j, _ := json.Marshal(NewUserForJSON(u))

    fmt.Print(string(j))


}


如果我們可以讓 User 實現(xiàn)json.Marshaller,并在幕后User.MarshalJSON()創(chuàng)建一個UserForJSON對象,那就太好了,但這會導(dǎo)致無限遞歸。


查看完整回答
反對 回復(fù) 2021-10-04
?
UYOU

TA貢獻1878條經(jīng)驗 獲得超4個贊

我不確定它是否是“最好”的方法,但它非常簡單。


func (u User) FullNameMarshal() []byte {

    u.FullName = u.FirstName + " " + u.LastName

    uj, err := json.Marshal(&u)

    if err != nil {

        fmt.Println(err)

    }

    return uj

}


查看完整回答
反對 回復(fù) 2021-10-04
  • 3 回答
  • 0 關(guān)注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號