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
posted @   左扬  阅读(138)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
levels of contents
点击右上角即可分享
微信分享提示