golang学习笔记--struct、json、map互相转化
结构体生成Json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package main import ( "encoding/json" "fmt" ) type IT struct { Company string `json: "-" ` //此字段不会输出到屏幕 //Company string `json:"company"` // 这样打印输出别名首字母就会小写(二次编码) Subjects []string `json: "subjects" ` //二次编码 IsOk bool `json: ",string" ` Price float64 `json: ",string" ` } func main() { //定义一个结构体变量,同时初始化 s := IT{ "itcast" , []string{ "Golang" , "PHP" , "Java" , "C++" }, true, 666.666} //编码,根据内容生成json文本 //buf, err := json.Marshal(s) //buf = {"subjects":["Golang","PHP","Java","C++"],"IsOk":"true","Price":"666.666"} buf, err := json.MarshalIndent(s, "" , " " ) //格式化编码 if err != nil { fmt.Println( "err = " , err) return } fmt.Println( "buf = " , string(buf)) } |
输出:
1 2 3 4 5 6 7 8 9 10 | buf = { "subjects" : [ "Golang" , "PHP" , "Java" , "C++" ], "IsOk" : "true" , "Price" : "666.666" } |
Json转成结构体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package main import ( "encoding/json" "fmt" ) type IT struct { Address string `json: "address" ` Languages []string `json: "languages" ` //二次编码 Status bool `json: "isok" ` Price float64 `json: "price" ` } func main() { jsonBuf := ` { "address" : "北京" , "languages" : [ "Golang" , "PHP" , "Java" , "Python" ], "status" : true, "price" : 666.666 }` var tmp IT //定义一个结构体变量 err := json.Unmarshal([]byte(jsonBuf), &tmp) //第二个参数要地址传递 if err != nil { fmt.Println( "err = " , err) return } //fmt.Println("tmp = ", tmp) fmt.Printf( "tmp = %+v\n" , tmp) type IT2 struct { Subjects []string `json: "languages" ` //二次编码 } var tmp2 IT2 err = json.Unmarshal([]byte(jsonBuf), &tmp2) //第二个参数要地址传递 if err != nil { fmt.Println( "err = " , err) return } fmt.Printf( "tmp2 = %+v\n" , tmp2) } |
输出:
1 2 | tmp = {Address:北京 Languages:[Golang PHP Java Python] Status:false Price:666.666} tmp2 = {Subjects:[Golang PHP Java Python]} |
Map生成Json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package main import ( "encoding/json" "fmt" ) func main() { //创建一个map m := make( map [string] interface {}, 4) //因为类型多,可以用interface空接口 m[ "address" ] = "北京" m[ "languages" ] = []string{ "Golang" , "PHP" , "Java" , "Python" } m[ "status" ] = true m[ "price" ] = 666.666 //编码成json //result, err := json.Marshal(m) //result = {"address":"北京","languages":["Golang","PHP","Java","Python"],"price":666.666,"status":true} result, err := json.MarshalIndent(m, "" , " " ) if err != nil { fmt.Println( "err = " , err) return } fmt.Println( "result = " , string(result)) } |
输出:
1 2 3 4 5 6 7 8 9 10 11 | result = { "address" : "北京" , "languages" : [ "Golang" , "PHP" , "Java" , "Python" ], "price" : 666.666, "status" : true } |
Json转化为Map
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | package main import ( "encoding/json" "fmt" ) func main() { jsonBuf := ` { "company" : "itcast" , "subjects" : [ "Go" , "C++" , "Python" , "Test" ], "isok" : true, "price" : 666.666 }` //创建一个map m := make( map [string] interface {}, 4) err := json.Unmarshal([]byte(jsonBuf), &m) //第二个参数要地址传递 if err != nil { fmt.Println( "err = " , err) return } fmt.Printf( "m = %+v\n" , m) // var str string // str = string(m["company"]) //err, 无法转换 // fmt.Println("str = ", str) var str string //类型断言, 值,它是value类型 for key, value := range m { //fmt.Printf("%v ============> %v\n", key, value) switch data := value.( type ) { case string: str = data fmt.Printf( "map[%s]的值类型为string, value = %s\n" , key, str) case bool: fmt.Printf( "map[%s]的值类型为bool, value = %v\n" , key, data) case float64: fmt.Printf( "map[%s]的值类型为float64, value = %f\n" , key, data) case []string: fmt.Printf( "map[%s]的值类型为[]string, value = %v\n" , key, data) case [] interface {}: fmt.Printf( "map[%s]的值类型为[]interface, value = %v\n" , key, data) } } } |
输出:
1 2 3 4 5 | m = map [company:itcast isok:true price:666.666 subjects:[Go C++ Python Test]] map [company]的值类型为string, value = itcast map [subjects]的值类型为[] interface , value = [Go C++ Python Test] map [isok]的值类型为bool, value = true map [price]的值类型为float64, value = 666.666000 |
[]interface{}转json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package main import ( "encoding/json" "fmt" ) func main() { var s [] interface {} s = append(s, 5) s = append(s, []string{ "Golang" , "PHP" , "Java" , "Python" }) s = append(s, map [string]string{ "hello" : "world" }) result, err := json.MarshalIndent(s, "" , " " ) if err != nil { fmt.Println( "err = " , err) return } fmt.Println( "result = " , string(result)) } |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 | result = [ 5, [ "Golang" , "PHP" , "Java" , "Python" ], { "hello" : "world" } ] |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理
2018-06-04 Windows下RabbitMQ安装及入门