示例:使用匿名结构体分离 JSON 数据
手机拥有屏幕、电池、指纹识别等信息,将这些信息填充为 JSON 格式的数据。如果需要选择性地分离 JSON 中的数据则较为麻烦。Go 语言中的匿名结构体可以方便地完成这个操作。
代码1-1 JSON 数据分离(具体文件:.../splitejson.go)
1、定义数据结构
首先,定义手机的各种数据结构体,如屏幕和电池,参考如下代码:
//定义手机屏幕 type Screen struct{ Size float32 //屏幕尺寸 ResX, ResY int //屏幕水平和垂直分辨率 } //定义电池 type Battery struct{ Capacity int //容量 }
2、准备 JSON 数据
准备手机数据结构体,填充数据,将数据序列化为 JSON 格式的字节数组,代码如下:
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 数据效果。
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) }