分享
  1. 首页
  2. 文章

18 Golang结构体详解(四)

learninginto · · 1106 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

结构体和Json相互转换

当Golang要为App或者小程序提供Api接口数据时,涉及到结构体和Json之间的相互转换

Golang序列化是指把结构体数据转换成Json格式的字符串;Golang Json的反序列化是指把Json数据转化成Golang中的结构体对象

Golang中的序列化和反序列化主要通过"encoding/json"包中的json.Marshal()和json.Unmarsual()

  • 序列化

结构体中私有属性不能被json包访问(首字母必须大写)

package main
import (
 "fmt" 
 "encoding/json"
)
type Student struct {
 Id int
 Gender string 
 Name string //私有属性不能被json包访问(首字母必须大写)
 Sno string
}
func main() {
 var s1 = Student {
 Id : 12,
 Gender : "男",
 Name : "李四",
 Sno : "s001",
 }
 fmt.Printf("%#v\n", s1)
 //main.Student{Id:12, Gender:"男", Name:"李四", Sno:"s001"}
 jsonByte, _ := json.Marshal(s1)
 jsonStr := string(jsonByte)
 fmt.Printf("%v", jsonStr)
 //{"Id":12,"Gender":"男","Name":"李四","Sno":"s001"}
}
  • 反序列化
type Student struct {
 ID int 
 Gender string
 Name string
 Sno string
}
func main() {
 var str = `{"Id":12,"Gender":"男","Name":"李四","Sno":"s001"}`
 var s1 Student
 err := json.Unmarshal([]byte(str),&s1)
 if err != nil {
 fmt.Println(err)
 }
 fmt.Printf("%#v\n", s1)
 fmt.Println(s1.Name)
 //main.Student{ID:12, Gender:"男", Name:"李四", Sno:"s001"}
 //李四
}
  • 嵌套结构体的序列化
type Student struct {
 Id int
 Gender string
 Name string
}
type Class struct {
 Title string
 Students []Student
}
func main(){
 c := Class {
 Title : "01班",
 Students : make([]Student, 0),
 }
 for i := 1; i <= 10; i++ {
 s := Student {
 Id:i,
 Gender:"男",
 Name:fmt.Sprintf("stu_%v", i),
 }
 c.Students = append(c.Students, s)
 }
 fmt.Println(c)
 //{01班 [{1 男 stu_1} {2 男 stu_2} {3 男 stu_3} {4 男 stu_4} 
 //{5 男 stu_5} {6 男 stu_6} {7 男 stu_7} {8 男 stu_8}
 //{9 男 stu_9} {10 男 stu_10}]}
 strByte, err := json.Marshal(c)
 if err != nil {
 fmt.Println(err)
 } else {
 fmt.Println(string(strByte)) 
 }
 //{"Title":"01班","Students":[{"Id":1,"Gender":"男","Name":"stu_1"},
 //{"Id":2,"Gender":"男","Name":"stu_2"},......,{"Id":10,"Gender":"男","Name":"stu_10"}]}
}
  • 嵌套结构体的反序列化

type Student struct {
 Id int 
 Gender string
 Name string
}
type Class struct {
 Title string
 Students []Student
}
func main() {
 str := `{"Title":"01班","Students":[{"Id":1,"Gender":"男","Name":"stu_1"},{"Id":2,"Gender":"男","Name":"stu_2"},{"Id":3,"Gender":"男","Name":"stu_3"},{"Id":4,"Gender":"男","Name":"stu_4"},{"Id":5,"Gender":"男","Name":"stu_5"},{"Id":6,"Gender":"男","Name":"stu_6"},{"Id":7,"Gender":"男","Name":"stu_7"},{"Id":8,"Gender":"男","Name":"stu_8"},{"Id":9,"Gender":"男","Name":"stu_9"},{"Id":10,"Gender":"男","Name":"stu_10"}]}`
 
 var c = &Class{}
 err := json.Unmarshal([]byte(str),c)
 if err != nil {
 fmt.Println(err)
 } else {
 fmt.Printf("%#v\n", c)
 fmt.Printf("%v", c.Title)
 }
 // &main.Class{Title:"01班", Students:[]main.Student{main.Student{Id:1, Gender:"男", Name:"stu_1"}, main.Student{Id:2, Gender:"男", Name:"stu_2"}, main.Student{Id:3, Gender:"男", Name:"stu_3"}, main.Student{Id:4, Gender:"男", Name:"stu_4"}, main.Student{Id:5, Gender:"男", Name:"stu_5"}, main.Student{Id:6, Gender:"男", Name:"stu_6"}, main.Student{Id:7, Gender:"男", Name:"stu_7"}, main.Student{Id:8, Gender:"男", Name:"stu_8"}, main.Student{Id:9, Gender:"男", Name:"stu_9"}, main.Student{Id:10, Gender:"男", Name:"stu_10"}}}
 //01班
}
结构体标签Tag

通过指定tag实现json序列化该字段时的key

type Student struct {
 Id int `json:"id"`
 Gender string `json:"gender"`
 Name string `json:"name"`
 Sno string `json:"no"`
}
func main (){
 var s1 = Student {
 Id : 12,
 Gender :"男",
 Name : "李四",
 Sno : "s001",
 }
 jsonByte, _ := json.Marshal(s1)
 jsonStr := string(jsonByte)
 fmt.Printf("%v", jsonStr)
 //{"id":12,"gender":"男","name":"李四","no":"s001"}
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:learninginto

查看原文:18 Golang结构体详解(四)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1106 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏