3 回答

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))
}

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

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。
- 3 回答
- 0 關(guān)注
- 136 瀏覽
添加回答
舉報