• 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
  • 相关阅读:
    【刷题】洛谷 P2764 最小路径覆盖问题
    【刷题】BZOJ 3546 [ONTAK2010]Life of the Party
    【刷题】BZOJ 3175 [Tjoi2013]攻击装置
    【刷题】BZOJ 4516 [Sdoi2016]生成魔咒
    【刷题】SPOJ 1811 LCS
    【刷题】洛谷 P3804 【模板】后缀自动机
    【刷题】SPOJ 8222 NSUBSTR
    (98)Wangdao.com_第三十天_拖拉事件
    ECMA Script 6_必须要知道的基础
    (97)Wangdao.com_第三十天_触摸事件
  • 原文地址:https://www.cnblogs.com/zuoyang/p/16328752.html
Copyright © 2020-2023  润新知