如何简化深层嵌套 JSON 的编组

我有一个包含一些静态和动态数据的 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 */

        } 

      }

    }

  }

}

下面是可以创建此 JSON 的代码


package main


import (

    "fmt"

    "encoding/json"

)

//ReqJSON struct

type ReqJSON struct {

    Request Request `json:"request"`

}

//Request struct

type Request struct {

    Data Data `json:"data"` 

}

//Data struct

type Data struct {

    Object Object `json:"object"`

}

//Object struct

type Object struct {

    User User `json:"user"`

}

//User struct

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"`

}

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

}

从上面可以看出,它包含的结构没有多大意义,因为它们更像是嵌套数据的占位符。那么我们如何让它更优化。由于所有数据都在最后一个结构中得到处理。应该应用什么方法来解组数据,因为响应将采用相同的格式并且希望使用最后一个结构。关于该方法的任何想法。另外,如何制作一个通用结构,因为我使用下面相同结构的多个 API 是一个示例


//ReqJSON for populating data

type ReqJSON struct {

    Request struct {

        Data struct {

            Object struct {

                Auth Auth `json:"auth"`

            } `json:"object"`

        } `json:"data"`

    } `json:"request"`

}



拉风的咖菲猫
浏览 98回答 3
3回答

幕布斯7119047

如果除了编组/解组之外不需要任何包装类型,则可以匿名定义它们: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))}

慕妹3242003

听起来不错。该解决方案有点冗长/多余,但您必须处理的数据格式也是如此。为了轻松地使用它,您可以创建辅助函数并使用它们: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 Userdata, err := json.Marshal(wrap(u))解组是:var r *ReqJSONerr := json.Unmarshal(data, &r)// Check erroru := unwrap(r) // Here we have the user

慕妹3146593

您无法消除复杂性,但可以将其中的一些隐藏在自定义封送拆收器中: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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go