json数据操作
759字约3分钟
2025-02-03
JSON,全称为JavaScript Object Notation(JavaScript 对象表示法),是一种轻量级的数据交换格式。它基于 JavaScript 语法,但可以独立于编程语言使用,因此成为了一种通用的数据格式。
JSON 的特点包括:
- 易于阅读和编写:JSON 使用人类可读的文本,易于理解和编写。
- 轻量级:JSON 的数据结构相对简单,文件大小比较小,传输效率高。
- 支持多种数据类型:JSON 支持字符串、数字、布尔值、数组、对象(键值对)、null 等基本数据类型。
- 跨平台和语言:JSON 不依赖于任何特定的编程语言,几乎所有现代编程语言都支持 JSON 的解析和生成。
JSON 的基本语法包括:
- 对象(Object):使用大括号 {} 表示,键值对的集合,键和值用冒号 : 分隔,不同键值对之间用逗号 , 分隔。
jsonCopy Code{
"name": "John Doe",
"age": 30,
"isStudent": false,
"address": {
"city": "New York",
"zipcode": "10001"
},
"hobbies": ["reading", "swimming"]
}
- 数组(Array):使用中括号 [] 表示,包含多个值,每个值可以是任意类型,用逗号 , 分隔。
jsonCopy Code["apple", "banana", "cherry"]
- 值(Value):可以是字符串、数值、布尔值、对象、数组、null 等。 JSON 的广泛应用包括配置文件、数据存储和传输等多个领域,尤其在 Web 开发中,JSON 常用于前后端数据交换。
package main
import (
"encoding/json"
"fmt"
"io"
"os"
)
// 定义一个结构体,用于表示一个人的信息
type Person struct {
Name string `json:"name"` // 姓名
Age int `json:"age"` // 年龄
Country string `json:"country"` // 国家
}
func main() {
// 创建一个 Person 结构体实例
person := Person{
Name: "Alice",
Age: 30,
Country: "USA",
}
// 将 Person 结构体实例转换为 JSON 格式的字节切片
jsonBytes, err := json.Marshal(person)
if err != nil {
fmt.Println("转换为 JSON 格式失败:", err)
return
}
// 打印 JSON 格式的字节切片
fmt.Println("JSON 格式的数据:", string(jsonBytes))
// 将 JSON 格式的字节切片写入文件
file, err := os.Create("person.json")
if err != nil {
fmt.Println("创建文件失败:", err)
return
}
defer file.Close()
_, err = file.Write(jsonBytes)
if err != nil {
fmt.Println("写入文件失败:", err)
return
}
fmt.Println("已将 JSON 格式的数据写入文件 person.json")
// 读取 person.json 文件中的 JSON 数据
file, err = os.Open("person.json")
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer file.Close()
// 读取 JSON 数据并反序列化到 Person 结构体中
var newPerson Person
err = json.NewDecoder(file).Decode(&newPerson)
if err != nil {
fmt.Println("解析 JSON 数据失败:", err)
return
}
// 打印反序列化后的 Person 结构体
fmt.Println("反序列化后的数据:", newPerson)
// 重新打开文件并使用 json.Unmarshal 进行反序列化
file, err = os.Open("person.json")
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer file.Close()
// 读取 JSON 数据并反序列化到 Person 结构体中
var anotherPerson Person
jsonBytes, err = io.ReadAll(file)
if err != nil {
fmt.Println("读取文件失败:", err)
return
}
err = json.Unmarshal(jsonBytes, &anotherPerson)
if err != nil {
fmt.Println("反序列化 JSON 数据失败:", err)
return
}
// 打印反序列化后的 Person 结构体
fmt.Println("重新反序列化后的数据:", anotherPerson)
}