这里说的复杂json,就是内嵌了数组的json,如下例所示:
var str string
str =
`{
"code": 10,
"data": [
{
"guildName": "Test1",
"nickName": "def",
"userId": 10025,
"userName": "abc"
},
{
"guildName": "Test2",
"nickName": "def",
"userId": 10026,
"userName": "yxz"
}
],
"message": "success"
}`
我们需要把这段json数据反序列化成struct类型,需要先定义以下两个结构体:
type cjsonElem struct {
GuildName string `json:"guildName"`
NickName string `json:"nickName"`
UserId int32 `json:"userId"`
UserName string `json:"userName"`
}
type cjson struct {
Code int32 `json:"code"`
Data []cjsonElem `json:"data"`
Message string `json:"message"`
}
注意:struct成员的首字母必须大写,小写的话会反序列化失败。
然后执行反序列化代码即可,如下所示:
val := cjson{}
err := json.Unmarshal([]byte(str), &val)
if err != nil {
fmt.Println("Unmarshal failed, err:", err)
return
}
fmt.Println("val:", val)
fmt.Println(val.Data[0].GuildName)
序列化代码如下:
val2 := cjson{
Code: 100,
Data: []cjsonElem{
{
GuildName: "abc",
NickName: "def",
UserId: 123,
UserName: "ghk",
},
{
GuildName: "abc1",
NickName: "def1",
UserId: 1231,
UserName: "ghk1",
},
},
Message: "success",
}
data1, _ := json.Marshal(&val2)
fmt.Println("data1: ", string(data1))