结构体和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转为结构体

// 准备一个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 协议》,转载必须注明作者和本文链接
六月的风
Junwind
讨论数量: 4

GOLAND 有自动转换快捷方式 :joy:

3周前 评论
Junwind (楼主) 3周前
liziyu (作者) 3周前
Junwind (楼主) 3周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
躺平大叔 @ 躺平社区
文章
136
粉丝
15
喜欢
102
收藏
59
排名:274
访问:3.5 万
私信
所有博文
社区赞助商