Go从入门到精通——结构体(struct)——示例:使用匿名结构体分离 JSON 数据
示例:使用匿名结构体分离 JSON 数据
手机拥有屏幕、电池、指纹识别等信息,将这些信息填充为 JSON 格式的数据。如果需要选择性地分离 JSON 中的数据则较为麻烦。Go 语言中的匿名结构体可以方便地完成这个操作。
代码1-1 JSON 数据分离(具体文件:.../splitejson.go)
1、定义数据结构
首先,定义手机的各种数据结构体,如屏幕和电池,参考如下代码:
1 2 3 4 5 6 7 8 9 10 | //定义手机屏幕 type Screen struct { Size float32 //屏幕尺寸 ResX, ResY int //屏幕水平和垂直分辨率 } //定义电池 type Battery struct { Capacity int //容量 } |
2、准备 JSON 数据
准备手机数据结构体,填充数据,将数据序列化为 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 | package main import "encoding/json" //定义手机屏幕 type Screen struct { Size float32 //屏幕尺寸 ResX, ResY int //屏幕水平和垂直分辨率 } //定义电池 type Battery struct { Capacity int //容量 } //生成 JSON 数据 func genJsonData() []byte { //完整数据结构 raw := & struct { Screen Battery HasTouchID bool //序列化时添加的字段:是否有指纹识别 }{ //屏幕参数 Screen: Screen{ Size: 5.5, ResX: 1920, ResY: 1080, }, //电池参数 Battery: Battery{ Capacity: 2910, }, //是否有指纹识别 HasTouchID: true, } //将数据序列化为 JSON jsonData, _ := json.Marshal(raw) return jsonData } |
3、分离JSON数据
调用 genJsonData 获得 JSON 数据,将需要的字段填充到匿名结构体实例中,通过 json.Unmarshal 反序列化 JSON 数据达成分离 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 | func main() { //生成一段 JSON 数据 jsonData := genJsonData() //打印输出{"Size":5.5,"ResX":1920,"ResY":1080,"Capacity":2910,"HasTouchID":true} fmt.Println(string(jsonData)) //只需要屏幕和指纹识别信息的结构和实例 ScreenAndTouch := struct { Screen HashTouchID bool }{} //反序列化到 screenAndTouch 中 json.Unmarshal(jsonData, &ScreenAndTouch) //输出 screenAndTouch 的详细结构 fmt.Printf( "%+v\n" , ScreenAndTouch) //只需要电池和指纹识别信息的结构和实例 batteryAndTouch := struct { Battery HashTouchID bool }{} //反序列化到 batteryAndTouch json.Unmarshal(jsonData, &batteryAndTouch) //输出 screenAndTouch 的详细结构 fmt.Printf( "%+v" , batteryAndTouch) } |
4、完整代码
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | package main import ( "encoding/json" "fmt" ) //定义手机屏幕 type Screen struct { Size float32 //屏幕尺寸 ResX, ResY int //屏幕水平和垂直分辨率 } //定义电池 type Battery struct { Capacity int //容量 } //生成 JSON 数据 func genJsonData() []byte { //完整数据结构 raw := & struct { Screen Battery HashTouchID bool //序列化时添加的字段:是否有指纹识别 }{ //屏幕参数 Screen: Screen{ Size: 5.5, ResX: 1920, ResY: 1080, }, //电池参数 Battery: Battery{ Capacity: 2910, }, //是否有指纹识别 HashTouchID: true, } //将数据序列化为 JSON jsonData, _ := json.Marshal(raw) return jsonData } func main() { //生成一段 JSON 数据 jsonData := genJsonData() //打印输出{"Size":5.5,"ResX":1920,"ResY":1080,"Capacity":2910,"HasTouchID":true} fmt.Println(string(jsonData)) //只需要屏幕和指纹识别信息的结构和实例 ScreenAndTouch := struct { Screen HashTouchID bool }{} //反序列化到 screenAndTouch 中 json.Unmarshal(jsonData, &ScreenAndTouch) //输出 screenAndTouch 的详细结构 fmt.Printf( "%+v\n" , ScreenAndTouch) //只需要电池和指纹识别信息的结构和实例 batteryAndTouch := struct { Battery HashTouchID bool }{} //反序列化到 batteryAndTouch json.Unmarshal(jsonData, &batteryAndTouch) //输出 screenAndTouch 的详细结构 fmt.Printf( "%+v" , batteryAndTouch) } |
运行结果输出如下:
1 2 3 4 5 6 7 8 9 | Starting: D:\ go -testfiles\bin\dlv.exe dap --check- go -version=false --listen=127.0.0.1:61836 from d:\ go -testfiles DAP server listening at: 127.0.0.1:61836 Type 'dlv help' for list of commands. { "Size" :5.5, "ResX" :1920, "ResY" :1080, "Capacity" :2910, "HashTouchID" :true} {Screen:{Size:5.5 ResX:1920 ResY:1080} HashTouchID:true} {Battery:{Capacity:2910} HashTouchID:true} Process 13128 has exited with status 0 Detaching dlv dap (20436) exited with code: 0 |
分类:
Go专题精讲
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具