📜  GoLang 的 JSON 基础知识(1)

📅  最后修改于: 2023-12-03 14:41:34.981000             🧑  作者: Mango

GoLang 的 JSON 基础知识

在 GoLang 中,JSON 是一种常用的数据交换格式。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。

什么是 JSON?

JSON 是一种基于文本的轻量级数据交换格式。其语法是 JavaScript 对象表示法的子集。JSON 中的数据格式是 key-value 的形式,其中 key 和 value 均为字符串类型,中间用冒号 : 分隔。多组 key-value 之间用逗号 , 分隔。JSON 的数据格式可以表示为一个普通的对象,也可以表示为一个数组。另外,JSON 中支持 null、true 和 false 三个值。下面是一个简单的 JSON 数据:

{
  "name": "张三",
  "age": 18,
  "gender": false,
  "city": null,
  "hobbies": [
    "篮球",
    "游泳",
    "听音乐"
  ]
}
GoLang 中的 JSON

GoLang 中提供了 encoding/json 包来支持 JSON 数据的解析和生成。它提供了如下几个函数:

  • json.Marshal(v interface{}) ([]byte, error) 用于将 GoLang 中的结构体转换成 JSON 数据;
  • json.Unmarshal(data []byte, v interface{}) error 用于将 JSON 数据转换成 GoLang 中的结构体;
  • json.NewEncoder(w io.Writer) *json.Encoder 用于将 JSON 数据编码到 io.Writer 中;
  • json.NewDecoder(r io.Reader) *json.Decoder 用于从 io.Reader 中解码 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 处理机制,从而更好地实现我们的需求。