Go语言基于标准库encoding/json进行json文件处理详解

 更新时间:2025年10月31日 09:12:49   作者:数据知道  
Go语言提供了强大的内置支持来处理JSON数据,主要通过标准库encoding/json实现,下面小编就和大家详细介绍一下使用encoding/json操作Json文件的具体实现方法吧

一、JSON序列化与反序列化

Go语言提供了强大的内置支持来处理JSON数据,主要通过标准库encoding/json实现。encoding/json 库的核心作用是实现 JSON数据Go语言数据结构 之间的相互转换,主要依赖两个核心函数。

功能方向核心函数作用
序列化json.Marshal(v interface{}) ([]byte, error)将Go数据结构(如结构体、切片)转换为JSON格式的字节切片
反序列化json.Unmarshal(data []byte, v interface{}) error将JSON格式的字节切片转换为指定的Go数据结构

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

使用json.Marshal函数可以将Go结构体转换为JSON格式的字节切片。这是最常用的场景,需注意结构体字段必须为 首字母大写(导出字段),否则无法被库识别。案例代码如下:

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))
}

输出:

{"name":"Alice","age":30}

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

使用json.Unmarshal函数可以将JSON数据解析为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文件。示例代码:

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文件内容为:

{"name":"Charlie","age":28}

2.2 读取JSON文件

使用os.Openjson.Decoder结合,可以从JSON文件中读取数据并解析为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数据。示例代码:

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标签,可以在序列化时忽略空字段。示例代码:

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))
}

输出:

{"name":"Eve"}

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

到此这篇关于Go语言基于标准库encoding/json进行json文件处理详解的文章就介绍到这了,更多相关Go处理json文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Goland 的安装及激活教程(window、linux下安装)

    Goland 的安装及激活教程(window、linux下安装)

    这篇文章主要介绍了Golang Goland 的安装及激活详细教程,包括window下安装goland和linux下安装goland,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 浅谈Go语言的高效编码细节

    浅谈Go语言的高效编码细节

    这篇文章主要介绍了浅谈Go语言的高效编码细节,我们都知道golang是天生的高并发,高效的编译型语言,可我们也都可知道,工具再好,用法不对,全都白费,我们来举2个常用路径来感受一下
    2023-01-01
  • 详解Go hash算法的支持

    详解Go hash算法的支持

    这篇文章主要介绍了详解Go hash算法的支持,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Golang基础常识性面试中常见的六大陷阱及应对技巧总结

    Golang基础常识性面试中常见的六大陷阱及应对技巧总结

    Go是一门简单有趣的语言,但与其他语言类似,它会有一些技巧,这篇文章主要给大家介绍了关于Golang基础常识性面试中常见的六大陷阱及应对技巧的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • go语言字符串的拼接和切片方法总结

    go语言字符串的拼接和切片方法总结

    在go语言中,因为字符串只能被访问,不能被修改,所以进行字符串拼接的时候,golang都需要进行内存拷贝,造成一定的性能消耗,这篇文章主要给大家介绍了关于go语言字符串的拼接和切片的相关资料,需要的朋友可以参考下
    2022-11-11
  • 通过Golang编写一个AES加密解密工具

    通过Golang编写一个AES加密解密工具

    这篇文章主要为大家详细介绍了如何利用Golang制作一个AES加密解密工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-05-05
  • 详解如何保留Go程序崩溃现场

    详解如何保留Go程序崩溃现场

    这篇文章主要为大家介绍了如何保留Go程序崩溃现场示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • golang解压带密码的zip包的方法详解

    golang解压带密码的zip包的方法详解

    ZIP 文件格式是一种常用的压缩和归档格式,用于将多个文件和目录打包到一个单独的文件中,同时对其内容进行压缩以减少文件大小,golang zip包的解压有官方的zip包(archive/zip),但是官方给的zip解压包代码只有解压不带密码的zip包,下面给出解压操作的封装
    2024-07-07
  • 一个简单的Golang实现的HTTP Proxy方法

    一个简单的Golang实现的HTTP Proxy方法

    今天小编就为大家分享一篇一个简单的Golang实现的HTTP Proxy方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Go语言中的recover()函数用法解读

    Go语言中的recover()函数用法解读

    Go语言recover()用于捕获panic,需与defer配合使用,在defer中调用时返回panic值,否则返回nil,Go1.21后panic(nil)触发runtime panic,recover返回*runtime.PanicNilError,应仅用于处理意外情况,注意作用域限制及性能影响
    2025-07-07

最新评论