结构体和json互转
结构体转json
假设现在有这样的一个数据结构,先用结构体实现,然后转为json
班级
班号
学习列表
学生1
学生学号
性别
名称
学生2
使用结构体实现上述数据结构
package main
import (
"fmt"
"math/rand"
"time"
)
// 班级信息结构体
type Class struct {
ClassCode string // 班级编号
Students []Student // 学生列表, 这里是一个切片类型,切片里面是多个学生数据
}
// 学生信息结构体
type Student struct {
StudentCode int // 学生学号
Name string // 学生名称
Gender int8 // 性别
}
func main() {
// 创建一个班级实例
myClass := Class{
ClassCode: "高三1班",
Students: []Student{}, // 初始化一个空切片, 切片的元素是Student结构体
}
fmt.Printf("%#v\n", myClass) // main.Class{ClassCode:"高三1班", Students:[]main.Student{}}
// 填充10个学生到班级下的学生列表中
rand.Seed(time.Now().UnixNano())
for i := 1; i <= 10; i++ {
stuObj := Student{
StudentCode: i,
Name: fmt.Sprintf("学生%02d", i),
Gender: int8(rand.Intn(2)),
}
fmt.Printf("%#v\n", stuObj)
myClass.Students = append(myClass.Students, stuObj)
}
fmt.Printf("%#v\n", myClass)
// 结构体转json
data, err := json.Marshal(myClass)
if err != nil {
fmt.Println("myClass转json失败", err)
return
}
// 输出json
fmt.Printf("%s\n", data)
}
json转为结构体
// 准备一个json字符串
jsonStr := `{"ClassCode":"高三1班","Students":[{"StudentCode":1,"Name":"学生01","Gender":1},{"StudentCode":2,"Name":"学生02","Gender":0},{"StudentCode":3,"Name":"学生03","Gender":1},{"StudentCode":4,"Name":"学生04","Gender":0},{"StudentCode":5,"Name":"学生05","Gender":0},{"StudentCode":6,"Name":"学生06","Gender":1},{"StudentCode":7,"Name":"学生07","Gender":1},{"StudentCode":8,"Name":"学生08","Gender":1},{"StudentCode":9,"Name":"学生09","Gender":1},{"StudentCode":10,"Name":"学生10","Gender":1}]}`
// 初始化一个Class空结构体
myClass := &Class{}
err := json.Unmarshal([]byte(jsonStr), myClass) // []byte(jsonStr)表示将字符串转为字节切片,Unmarshal第二个参数是引用类型,所以myClass声明时,需要给指针地址
if err != nil {
fmt.Println("json转结构体失败", err)
return
}
fmt.Printf("%#v\n", myClass)
fmt.Println(myClass.ClassCode)
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: