📅  最后修改于: 2023-12-03 14:41:34.981000             🧑  作者: Mango
在 GoLang 中,JSON 是一种常用的数据交换格式。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。
JSON 是一种基于文本的轻量级数据交换格式。其语法是 JavaScript 对象表示法的子集。JSON 中的数据格式是 key-value 的形式,其中 key 和 value 均为字符串类型,中间用冒号 :
分隔。多组 key-value 之间用逗号 ,
分隔。JSON 的数据格式可以表示为一个普通的对象,也可以表示为一个数组。另外,JSON 中支持 null、true 和 false 三个值。下面是一个简单的 JSON 数据:
{
"name": "张三",
"age": 18,
"gender": false,
"city": null,
"hobbies": [
"篮球",
"游泳",
"听音乐"
]
}
GoLang 中提供了 encoding/json
包来支持 JSON 数据的解析和生成。它提供了如下几个函数:
下面是一个示例程序,展示了如何使用 encoding/json
包将 GoLang 中的结构体转换成 JSON 数据和将 JSON 数据转换成 GoLang 中的结构体:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Gender bool `json:"gender"`
City *string `json:"city"`
Hobbies []string `json:"hobbies"`
}
func main() {
// 序列化
person := Person{
Name: "张三",
Age: 18,
Gender: false,
City: nil,
Hobbies: []string{
"篮球",
"游泳",
"听音乐",
},
}
data, err := json.Marshal(person)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(data))
// 反序列化
jsonData := `{
"name": "李四",
"age": 20,
"gender": true,
"city": "北京",
"hobbies": [
"唱歌",
"跳舞",
"打球"
]
}`
var person2 Person
err = json.Unmarshal([]byte(jsonData), &person2)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(person2)
}
在 Person
结构体中,我们添加了 json
标签来指定每个字段在 JSON 数据中的字段名。例如,Name
对应的 JSON 字段名为 name
。如果没有指定 json
标签,则默认使用字段名作为 JSON 字段名。
注意,在 Person
结构体中,使用了 *string
类型的指针来表示 JSON 中的 null 值。因为在 GoLang 中,任何非指针类型的变量都不可能为空。如果 JSON 中的某个属性为 null,那么在 GoLang 中表示该属性的变量应该为指针类型。
本文介绍了 GoLang 中对 JSON 数据的支持。在开发中,我们通常会遇到需要将数据转换成 JSON 格式,或者需要从 JSON 数据中解析出结构体的情况。GoLang 中提供了 encoding/json
包来支持这些功能,同时还支持自定义 JSON 的编码和解码方式,以及支持使用缓存提高性能等。了解这些知识可以使我们更好地理解 GoLang 中的 JSON 处理机制,从而更好地实现我们的需求。