Go基础:json文件处理详解(标准库`encoding/json`)

文章目录

    • 一、JSON序列化与反序列化
      • [1.1 序列化(将Go结构体转换为JSON)](#1.1 序列化(将Go结构体转换为JSON))
      • [1.2 反序列化(将JSON转换为Go结构体)](#1.2 反序列化(将JSON转换为Go结构体))
    • 二、JSON文件读写
      • [2.1 写入JSON文件](#2.1 写入JSON文件)
      • [2.2 读取JSON文件](#2.2 读取JSON文件)
    • 三、JSON处理中的常见技巧
      • [3.1 处理嵌套JSON](#3.1 处理嵌套JSON)
      • [3.2 忽略空字段](#3.2 忽略空字段)

一、JSON序列化与反序列化

Go语言提供了强大的内置支持来处理JSON数据,主要通过标准库encoding/json实现。

1.1 序列化(将Go结构体转换为JSON)

使用json.Marshal函数可以将Go结构体转换为JSON格式的字节切片。

示例代码:

go 复制代码
package main
import (
	"encoding/json"
	"fmt"
)
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
func main() {
	person := Person{Name: "Alice", Age: 30}
	jsonData, err := json.Marshal(person)
	if err != nil {
		fmt.Println("Error marshaling JSON:", err)
		return
	}
	fmt.Println(string(jsonData))
}

输出:

json 复制代码
{"name":"Alice","age":30}

1.2 反序列化(将JSON转换为Go结构体)

使用json.Unmarshal函数可以将JSON数据解析为Go结构体。

示例代码:

go 复制代码
package main
import (
	"encoding/json"
	"fmt"
)
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
func main() {
	jsonData := `{"name":"Bob","age":25}`
	var person Person
	err := json.Unmarshal([]byte(jsonData), &person)
	if err != nil {
		fmt.Println("Error unmarshaling JSON:", err)
		return
	}
	fmt.Printf("Name: %s, Age: %d\n", person.Name, person.Age)
}

输出:

复制代码
Name: Bob, Age: 25

二、JSON文件读写

2.1 写入JSON文件

使用os.Createjson.Marshal结合,可以将Go结构体数据写入JSON文件。

示例代码:

go 复制代码
package main
import (
	"encoding/json"
	"os"
)
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
func main() {
	person := Person{Name: "Charlie", Age: 28}
	file, err := os.Create("person.json")
	if err != nil {
		panic(err)
	}
	defer file.Close()
	encoder := json.NewEncoder(file)
	err = encoder.Encode(person)
	if err != nil {
		panic(err)
	}
}

运行后,person.json文件内容为:

json 复制代码
{"name":"Charlie","age":28}

2.2 读取JSON文件

使用os.Openjson.Decoder结合,可以从JSON文件中读取数据并解析为Go结构体。

示例代码:

go 复制代码
package main
import (
	"encoding/json"
	"fmt"
	"os"
)
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
func main() {
	file, err := os.Open("person.json")
	if err != nil {
		panic(err)
	}
	defer file.Close()
	var person Person
	decoder := json.NewDecoder(file)
	err = decoder.Decode(&person)
	if err != nil {
		panic(err)
	}
	fmt.Printf("Name: %s, Age: %d\n", person.Name, person.Age)
}

输出:

复制代码
Name: Charlie, Age: 28

三、JSON处理中的常见技巧

3.1 处理嵌套JSON

Go语言支持嵌套结构体,可以轻松处理复杂的JSON数据。

示例代码:

go 复制代码
package main
import (
	"encoding/json"
	"fmt"
)
type Address struct {
	City  string `json:"city"`
	State string `json:"state"`
}
type Person struct {
	Name    string  `json:"name"`
	Age     int     `json:"age"`
	Address Address `json:"address"`
}
func main() {
	jsonData := `{"name":"David","age":40,"address":{"city":"New York","state":"NY"}}`
	var person Person
	err := json.Unmarshal([]byte(jsonData), &person)
	if err != nil {
		fmt.Println("Error unmarshaling JSON:", err)
		return
	}
	fmt.Printf("Name: %s, City: %s\n", person.Name, person.Address.City)
}

输出:

复制代码
Name: David, City: New York

3.2 忽略空字段

通过omitempty标签,可以在序列化时忽略空字段。

示例代码:

go 复制代码
package main
import (
	"encoding/json"
	"fmt"
)
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age,omitempty"`
}
func main() {
	person := Person{Name: "Eve"}
	jsonData, err := json.Marshal(person)
	if err != nil {
		fmt.Println("Error marshaling JSON:", err)
		return
	}
	fmt.Println(string(jsonData))
}

输出:

json 复制代码
{"name":"Eve"}

Go语言通过encoding/json包提供了强大的JSON处理能力,包括序列化、反序列化、文件读写及复杂数据结构的处理。

相关推荐
为思念酝酿的痛7 小时前
POSIX信号量
linux·运维·服务器·后端
小羊在睡觉7 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
AI玫瑰助手7 小时前
Python函数:默认参数的定义与注意事项
开发语言·python·信息可视化
油炸自行车7 小时前
Claude Code 错误:API Error: 400 Failed to deserialize the JSON body into the
开发语言·javascript·json·trae·claude code·api error 400
肩上风骋7 小时前
C++14特性
开发语言·c++·c++14特性
swipe7 小时前
Neo4j + Graph RAG 医疗知识图谱工程实践:患者教育问答真正需要的是“关系可追溯”
后端·langchain·llm
源码宝8 小时前
MES系统源码:Java8 + SpringBoot2.7 + MySQL8 + Redis,后端源码清爽易扩展
java·后端·源码·springboot·mes系统·源码二开·mes源码
JAVA社区9 小时前
Java高级全套教程(十)—— SpringCloudAlibaba超详细实战详解
java·开发语言·spring cloud·面试·职场和发展
弥树子9 小时前
踩坑记录:服务器内网调用接口,真实请求URL与官方公开URL不一致问题排查
开发语言·php
金銀銅鐵9 小时前
[Java] 如何理解 class 文件中方法的 descriptor?
java·后端