Go从入门到精通——结构体(struct)——示例:使用匿名结构体分离 JSON 数据
示例:使用匿名结构体分离 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 数据效果。
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、完整代码
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)
}
运行结果输出如下:
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