Go之json数据

Posted louis-sun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go之json数据相关的知识,希望对你有一定的参考价值。

json是一种轻量级的数据交换格式,有限提高数据在网络中的传输效率,易于阅读和编写数据,且易于生成key-value格式数据。

一:json数据的序列化举例

package main

import (
	"fmt"
	"encoding/json"
)

//结构体变量序列化
type Personal struct{
	Name string
	Age int
	Hobby string
}

func StructJson() {
	personal := Personal{
		Name : "louis",
		Age : 18,
		Hobby : "it",
	}
	//json.Marshal返回[]byte与err
	personal_json, _:= json.Marshal(personal)
	//由于personal_json是[]byte数据类型,故要通过string()函数转换
	fmt.Printf("personal_json=%v
", string(personal_json))
}

//map数据序列化
func MapJson(){
	m := map[string]interface{}{
		"Address":"深圳",
		"Phone":"12345678911",
		"Salary":10000,
	}
	map_json, _ := json.Marshal(m)
	fmt.Printf("map_json=%v
", string(map_json))
}

//切片序列化
func SliceJson(){
	s := []int{1,2,3,4,5,6,7,8}
	slice_json, _ := json.Marshal(s)
	fmt.Printf("slice_json=%v
", string(slice_json))	
}

//基本数据类型序列化
func Base() {
	str := "string"
	base_json, _ := json.Marshal(str)
	fmt.Printf("base_json=%v
", string(base_json))	
}
func main() {
	StructJson()
	MapJson()
	SliceJson()
	Base()
}
结果
[ `go run json.go` | done ]
	personal_json={"Name":"louis","Age":18,"Hobby":"it"}
	map_json={"Address":"深圳","Phone":"12345678911","Salary":10000}
	slice_json=[1,2,3,4,5,6,7,8]
	base_json="string"

 二:json反序列化

package main

import (
	"fmt"
	"encoding/json"
)

//结构体变量序列化
type Personal struct{
	Name string
	Age int
	Hobby string
}

func StructJson() {
	personal := Personal{
		Name : "louis",
		Age : 18,
		Hobby : "it",
	}
	//json.Marshal返回[]byte与err
	personal_json, _:= json.Marshal(personal)
	//由于personal_json是[]byte数据类型,故要通过string()函数转换
	fmt.Printf("personal_json=%v
", string(personal_json))
	var personal_data Personal
	//接受的变量必须为指针类型
	err := json.Unmarshal([]byte(personal_json), &personal_data)
	if err != nil {
		fmt.Printf("反序列化错误:%v
", err)
	}
	fmt.Printf("personal_json反序列化=%v
", personal_data)
}

func main() {
	StructJson()
}
结果
[ `go run json.go` | done ]
	personal_json={"Name":"louis","Age":18,"Hobby":"it"}
	personal_json反序列化={louis 18 it}

 三:结构体的序列化的反射机制

当结构体定义的字段为大写字母开头,但客户端希望接受到的都是小写字母的字段时,可以使用反射机制

package main

import (
	"fmt"
	"encoding/json"
)

//结构体变量序列化
type Personal struct{
	Name string `json:"name"`
	Age int `json:"age"`
	Hobby string `json:"hobby_data"`
}

func StructJson() {
	personal := Personal{
		Name : "louis",
		Age : 18,
		Hobby : "it",
	}
	personal_json, _:= json.Marshal(personal)
	fmt.Printf("personal_json=%v
", string(personal_json))
}

func main() {
	StructJson()
}
结果
[ `go run json.go` | done ]
	personal_json={"name":"louis","age":18,"hobby_data":"it"}

 

以上是关于Go之json数据的主要内容,如果未能解决你的问题,请参考以下文章

go语言之玩味json

深入理解Go Json.Unmarshal精度丢失之谜

Go语言的JSON输入(解码)(反序列化)之struct存储

golang的xorm如何将[]map[string][]byte 格式的数据序列化成json输出

实用代码片段将json数据绑定到html元素 (转)

Go语言之读取yaml配置文件,转换成struct结构,json形式输出