• Go语言使用匿名结构体解析JSON数据


    手机拥有屏幕、电池、指纹识别等信息,将这些信息填充为 JSON 格式的数据。如果需要选择性地分离 JSON 中的数据则较为麻烦。Go 语言中的匿名结构体可以方便地完成这个操作。

    首先给出完整的代码,然后再讲解每个部分。

    1. package main
    2. import (
    3. "encoding/json"
    4. "fmt"
    5. )
    6. // 定义手机屏幕
    7. type Screen struct {
    8. Size float32 // 屏幕尺寸
    9. ResX, ResY int // 屏幕水平和垂直分辨率
    10. }
    11. // 定义电池
    12. type Battery struct {
    13. Capacity int // 容量
    14. }
    15. // 生成json数据
    16. func genJsonData() []byte {
    17. // 完整数据结构
    18. raw := &struct {
    19. Screen
    20. Battery
    21. HasTouchID bool // 序列化时添加的字段:是否有指纹识别
    22. }{
    23. // 屏幕参数
    24. Screen: Screen{
    25. Size: 5.5,
    26. ResX: 1920,
    27. ResY: 1080,
    28. },
    29. // 电池参数
    30. Battery: Battery{
    31. 2910,
    32. },
    33. // 是否有指纹识别
    34. HasTouchID: true,
    35. }
    36. // 将数据序列化为json
    37. jsonData, _ := json.Marshal(raw)
    38. return jsonData
    39. }
    40. func main() {
    41. // 生成一段json数据
    42. jsonData := genJsonData()
    43. fmt.Println(string(jsonData))
    44. // 只需要屏幕和指纹识别信息的结构和实例
    45. screenAndTouch := struct {
    46. Screen
    47. HasTouchID bool
    48. }{}
    49. // 反序列化到screenAndTouch
    50. json.Unmarshal(jsonData, &screenAndTouch)
    51. // 输出screenAndTouch的详细结构
    52. fmt.Printf("%+v ", screenAndTouch)
    53. // 只需要电池和指纹识别信息的结构和实例
    54. batteryAndTouch := struct {
    55. Battery
    56. HasTouchID bool
    57. }{}
    58. // 反序列化到batteryAndTouch
    59. json.Unmarshal(jsonData, &batteryAndTouch)
    60. // 输出screenAndTouch的详细结构
    61. fmt.Printf("%+v ", batteryAndTouch)
    62. }

    定义数据结构

    首先,定义手机的各种数据结构体,如屏幕和电池,参考如下代码:

    1. // 定义手机屏幕
    2. type Screen struct {
    3. Size float32 // 屏幕尺寸
    4. ResX, ResY int // 屏幕水平和垂直分辨率
    5. }
    6. // 定义电池
    7. type Battery struct {
    8. Capacity int // 容量
    9. }

    上面代码定义了屏幕结构体和电池结构体,它们分别描述屏幕和电池的各种细节参数。

    准备JSON数据

    准备手机数据结构,填充数据,将数据序列化为 JSON 格式的字节数组,代码如下:

    1. // 生成JSON数据
    2. func genJsonData() []byte {
    3. // 完整数据结构
    4. raw := &struct {
    5. Screen
    6. Battery
    7. HasTouchID bool // 序列化时添加的字段:是否有指纹识别
    8. }{
    9. // 屏幕参数
    10. Screen: Screen{
    11. Size: 5.5,
    12. ResX: 1920,
    13. ResY: 1080,
    14. },
    15. // 电池参数
    16. Battery: Battery{
    17. 2910,
    18. },
    19. // 是否有指纹识别
    20. HasTouchID: true,
    21. }
    22. // 将数据序列化为JSON
    23. jsonData, _ := json.Marshal(raw)
    24. return jsonData
    25. }

    代码说明如下:

    • 第 4 行定义了一个匿名结构体。这个结构体内嵌了 Screen 和 Battery 结构体,同时临时加入了 HasTouchID 字段。
    • 第 10 行,为刚声明的匿名结构体填充屏幕数据。
    • 第 17 行,填充电池数据。
    • 第 22 行,填充指纹识别字段。
    • 第 26 行,使用 json.Marshal 进行 JSON 序列化,将 raw 变量序列化为 []byte 格式的 JSON 数据。

    分离JSON数据

    调用 genJsonData 获得 JSON 数据,将需要的字段填充到匿名结构体实例中,通过 json.Unmarshal 反序列化 JSON 数据达成分离 JSON 数据效果。代码如下:

    1. func main() {
    2. // 生成一段JSON数据
    3. jsonData := genJsonData()
    4. fmt.Println(string(jsonData))
    5. // 只需要屏幕和指纹识别信息的结构和实例
    6. screenAndTouch := struct {
    7. Screen
    8. HasTouchID bool
    9. }{}
    10. // 反序列化到screenAndTouch中
    11. json.Unmarshal(jsonData, &screenAndTouch)
    12. // 输出screenAndTouch的详细结构
    13. fmt.Printf("%+v ", screenAndTouch)
    14. // 只需要电池和指纹识别信息的结构和实例
    15. batteryAndTouch := struct {
    16. Battery
    17. HasTouchID bool
    18. }{}
    19. // 反序列化到batteryAndTouch
    20. json.Unmarshal(jsonData, &batteryAndTouch)
    21. // 输出screenAndTouch的详细结构
    22. fmt.Printf("%+v ", batteryAndTouch)
    23. }

    代码说明如下:

      • 第 4 行,调用 genJsonData() 函数,获得 []byte 类型的 JSON 数据。
      • 第 6 行,将 jsonData 的 []byte 类型的 JSON 数据转换为字符串格式并打印输出。
      • 第 9 行,构造匿名结构体,填充 Screen 结构和 HasTouchID 字段,第 12 行中的 {} 表示将结构体实例化。
      • 第 15 行,调用 json.Unmarshal,输入完整的 JSON 数据(jsonData),将数据按第 9 行定义的结构体格式序列化到 screenAndTouch 中。
      • 第 18 行,打印输出 screenAndTouch 中的详细数据信息。
      • 第 21 行,构造匿名结构体,填充 Battery 结构和 HasTouchID 字段。
      • 第 27 行,调用 json.Unmarshal,输入完整的 JSON 数据(jsonData),将数据按第 21 行定义的结构体格式序列化到 batteryAndTouch 中。
      • 第 30 行,打印输出 batteryAndTouch 的详细数据信息。
  • 相关阅读:
    elk6.3 centos集群搭建 head插件安装
    10.2半群,同余关系,半群直积,商半群
    10.1代数结构
    9.4 关系的闭包
    9.5 等价关系
    9.6偏序关系
    9.3 关系的表示
    9.1 关系及关系性质
    差分数组
    拓扑排序
  • 原文地址:https://www.cnblogs.com/dfsxh/p/10193457.html
Copyright © 2020-2023  润新知