Go语言基础入门(处理JSON)

本文介绍了Go语言中使用encoding/json包进行JSON数据的编码和解码。通过示例展示了如何将Go结构体转换为JSON格式,利用`json`标签处理键名大小写和空字段,并演示了解码JSON数据到结构体的过程。理解Go与JSON之间的数据类型对应关系对于正确处理数据至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript 对象表示法是一种用于存储和交换数据的格式,这是一种人类能够理解的纯文本格式。JSON可以以键值对的方式表示数据,也可以以数组的方式表示数据。从很大程度上说它已经取代可扩展的标记语言XML。

Go标准库中提供了encoding/json包,用于编码和解码JSON数据。

函数Marshal将Go数据编码为JSON。

jsonByteData, err = json.Marshall(p)

在JSON数据中,所有的键名都是以小写字母大头。因此我们对结构体中的数据字段指定标签,对于带JSON标签的数据,将使用标签中的数据替换。

package main

import (
	"encoding/json"
	"fmt"
	"log"
)

type Person struct {
	Name string `json:"name"`
	Age int `json:"age"`
	Hobbies []string `json:"hobbies"`
}

func main()  {
	hobbies := []string{"Cycling", "Chees", "Techno"}
	p := Person{
		Name: "G",
		Age: 2,
		Hobbies: hobbies,
	}
	fmt.Printf("%+v\n", p)
	jsonByteData, err := json.Marshal(p)
	if err != nil{
		log.Fatal(err)
	}
	jsonStringData := string((jsonByteData))
	fmt.Println(jsonStringData)
}

在JSON键名后面加上omitempty用于在编码为JSON时忽略结构体中的空字段。如果不写,结构体中的空字段将被设定为零值。

type Person struct {
	Name string `json:"name,omitempty"`
	Age int `json:"age,omitempty"`
	Hobbies []string `json:"hobbies,omitempty"`
}

函数Unmarshal接受一个字节切片以及一个指定要将数据解码为何种格式的接口。该函数将JSON字符串转换为结构体实例。

package main

import (
	"encoding/json"
	"fmt"
	"log"
)
type Person struct {
	Name string `json:"name"`
	Age int `json:"age"`
	Hobbies []string `json:"hobbies"`
}

func main()  {
	jsonStringData := `{"name":"GE","age":44,"hobbies":["Cys","Che","Y"]}`

	jsonByteData := []byte(jsonStringData) //JSON字符串数据转换为字节切片
	p := Person{} //定义结构体来告诉解码器将键映射到的字段
	err := json.Unmarshal(jsonByteData, &p)
	if err != nil{
		log.Fatal(err)
	}
	fmt.Printf("%+v\n", p)
}

JavaScript是一种弱类型语言,即不显式的声明变量的数据类型。而Go是强类型的。所以在创建用于编码和解码JSON的结构体时,必须对上述数据类型的对应关系做到心中有数,如果数据类型不匹配,encoding/json包将会引发错误。

GO和JSON数据类型
JSON       Go
Boolean       bool
Numberfloat64
Stringstring
Array[]interface{}
Objectmap[string]interface{}
Nullnil

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值