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

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

如何簡化深層嵌套 JSON 的編組

如何簡化深層嵌套 JSON 的編組

Go
拉風(fēng)的咖菲貓 2023-04-17 15:27:04
我有一個包含一些靜態(tài)和動態(tài)數(shù)據(jù)的 JSON。下面是一個 JSON 示例{  "request": {  /*Static data start */    "data": {      "object": { /*Static data ends here*/        "user": { /*Dynamic data start here */          "userid": "andmmdn",          "ipaddr": "1.1.1.1",          "noofusers": "100",          "qos": "34",          "id": "kldjflkdfjlkdjfkld",          "domain": "xyz.com" /*Dynamic data ends here */        }       }    }  }}下面是可以創(chuàng)建此 JSON 的代碼package mainimport (    "fmt"    "encoding/json")//ReqJSON structtype ReqJSON struct {    Request Request `json:"request"`}//Request structtype Request struct {    Data Data `json:"data"` }//Data structtype Data struct {    Object Object `json:"object"`}//Object structtype Object struct {    User User `json:"user"`}//User structtype User struct {    UserID string `json:"userid"`    IPAddr string `json:"ipaddr"`    Noofusers string `json:"noofusers"`    Qos string `json:"qos"`    ID string `json:"id"`    Domain string `json:"domain"`}func main() {    test := ReqJSON {        Request{            Data: Data{                Object: Object{                    User: User{                        UserID: "andmmdn",                        IPAddr: "1.1.1.1",                        Noofusers: "100",                        Qos: "34",                        ID: "kldjflkdfjlkdjfkld",                        Domain: "xyz.com",                    },                  },              },        },    }    jsonEncode, _ := json.Marshal(test)    jsonIdent, _ := json.MarshalIndent(&test, "", "\t")    fmt.Println(string(jsonEncode))    fmt.Println(string(jsonIdent))}從上面可以看出,它包含的結(jié)構(gòu)沒有多大意義,因為它們更像是嵌套數(shù)據(jù)的占位符。那么我們?nèi)绾巫屗鼉?yōu)化。由于所有數(shù)據(jù)都在最后一個結(jié)構(gòu)中得到處理。應(yīng)該應(yīng)用什么方法來解組數(shù)據(jù),因為響應(yīng)將采用相同的格式并且希望使用最后一個結(jié)構(gòu)。關(guān)于該方法的任何想法。另外,如何制作一個通用結(jié)構(gòu),因為我使用下面相同結(jié)構(gòu)的多個 API 是一個示例//ReqJSON for populating datatype ReqJSON struct {    Request struct {        Data struct {            Object struct {                Auth Auth `json:"auth"`            } `json:"object"`        } `json:"data"`    } `json:"request"`}
查看完整描述

3 回答

?
幕布斯7119047

TA貢獻(xiàn)1794條經(jīng)驗 獲得超8個贊

如果除了編組/解組之外不需要任何包裝類型,則可以匿名定義它們:


type ReqJSON struct {

    Request struct {

        Data struct {

            Object struct {

                User User `json:"user"`

            } `json:"object"`

        } `json:"data"`

    } `json:"request"`

}


type User struct {

    UserID string `json:"userid"`

    IPAddr string `json:"ipaddr"`

    Noofusers string `json:"noofusers"`

    Qos string `json:"qos"`

    ID string `json:"id"`

    Domain string `json:"domain"`

}

并且,借用 icza 的回答,您可以將訪問器方法添加到ReqJSON:


func (j *ReqJSON) User() User     { return j.Request.Data.Object.User }

func (j *ReqJSON) SetUser(u User) { j.Request.Data.Object.User = u }


func main() {

    var j ReqJSON

    j.SetUser(User{

            UserID:    "_id",

            IPAddr:    "1.1.1.1",

            Noofusers: "100",

            Qos:       "34",

            ID:        "kldjflkdfjlkdjfkld",

            Domain:    "xyz.com",

    })


    b, err := json.MarshalIndent(j, "", "  ")

    fmt.Println(err, string(b))

}


查看完整回答
反對 回復(fù) 2023-04-17
?
慕妹3242003

TA貢獻(xiàn)1824條經(jīng)驗 獲得超6個贊

聽起來不錯。該解決方案有點冗長/多余,但您必須處理的數(shù)據(jù)格式也是如此。


為了輕松地使用它,您可以創(chuàng)建輔助函數(shù)并使用它們:


func wrap(u User) *ReqJSON {

    return &ReqJSON{Request: Request{Data: Data{Object: Object{User: u}}}}

}


func unwrap(r *ReqJSON) User {

    return r.Request.Data.Object.User

}

但除此之外,你無法真正簡化其他事情。


所以編組 aUser就像:


var u User

data, err := json.Marshal(wrap(u))

解組是:


var r *ReqJSON

err := json.Unmarshal(data, &r)

// Check error


u := unwrap(r) // Here we have the user


查看完整回答
反對 回復(fù) 2023-04-17
?
慕妹3146593

TA貢獻(xiàn)1820條經(jīng)驗 獲得超9個贊

您無法消除復(fù)雜性,但可以將其中的一些隱藏在自定義封送拆收器中:


type Request struct {

    UserID    string `json:"userid"`

    IPAddr    string `json:"ipaddr"`

    Noofusers string `json:"noofusers"`

    Qos       string `json:"qos"`

    ID        string `json:"id"`

    Domain    string `json:"domain"`

}


func (r *Request) MarshalJSON() ([]byte, error) {

    type request struct {

        Data struct {

            Object struct {

                User struct {

                    Request

                } `json:"user"`

            } `json:"object"`

        } `json:"data"`

    }

    structure := request{Data: data{Object: object{User: user{r}}}}

    return json.Marshal(structure)    

}

如果需要,可以對 反向使用相同的方法UnmarshalJSON。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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