[{"key":"15275771","pack":{"1":[{"name":"消息配置","id":15275771,"version":1,"createUser":"molaifeng","data":"test"}]},"callback":"http://your-seervice-domain/msg/callback"}
]

上面的 json 该如何解析,或是对方需要传输此 json 数据,该如何构造。

最简单的方法就是善用工具,比如 json2go ,给出如下 struct 结构

type AutoGenerated []struct {Key string `json:"key"`Pack Pack `json:"pack"`Callback string `json:"callback"`
}
type Num1 struct {Name string `json:"name"`ID int64 `json:"id"`Version int `json:"version"`CreateUser string `json:"createUser"`Data string `json:"data"`
}
type Pack struct {Num1 []Num1 `json:"1"`
}

不过,仔细看 json 里的 pack 字段,也可以用 map 构造,而且更简单

type DataPack struct {Key string `json:"key"`Pack MapListDataPack `json:"pack"`Callback string `json:"callback"`
}type MapListDataPack map[string][]*ListDataPacktype ListDataPack struct {Name string `json:"name"`ID int64 `json:"id"`Version int `json:"version"`CreateUser string `json:"createUser"`Data string `json:"data"`
}

完整的示例为

package mainimport ("encoding/json""fmt"
)type DataPack struct {Key      string          `json:"key"`Pack     MapListDataPack `json:"pack"`Callback string          `json:"callback"`
}type MapListDataPack map[string][]*ListDataPacktype ListDataPack struct {Name       string `json:"name"`ID         int64  `json:"id"`Version    int    `json:"version"`CreateUser string `json:"createUser"`Data       string `json:"data"`
}func main() {str := `[{"key":"15275771","pack":{"1":[{"name":"消息配置","id":15275771,"version":1,"createUser":"molaifeng","data":"test"}]},"callback":"http://your-seervice-domain/msg/callback"}]`dataPacks := make([]DataPack, 0)err := json.Unmarshal([]byte(str), &dataPacks)if err != nil {fmt.Println(err)return}fmt.Println(dataPacks)}

总之就是一句话,对于构造复杂的数据结构时,需要用到 map,而不是单纯依靠 slice 及基础结构体。