示例:使用匿名结构体分离 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)

}