Go语言基于标准库encoding/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数据结构
  • 目录
    • 一、JSON序列化与反序列化
      • 1.1 序列化(将Go结构体转换为JSON)
      • 1.2 反序列化(将JSON转换为Go结构体)
    • 二、JSON文件读写
      • 2.1 写入JSON文件
      • 2.2 读取JSON文件
    • 三、JSON处理中的常见技巧
      • 3.1 处理嵌套JSON
      • 3.2 忽略空字段

    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数据结构

    使用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}

    使用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: %dn", person.Name, person.Age)
    }
    

    输出:

    Name: Bob, Age: 25

    使用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}

    使用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: %dn", person.Name, person.Age)
    }
    

    输出:

    Name: Charlie, Age: 28

    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: %sn", person.Name, person.Address.City)
    }
    

    输出:

    Name: David, City: New York

    通过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文件内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Go语言中处理JSON字符串转换的常见方式
    • go语言中json处理方式详解
    • Go语言中常用json处理操作小结
    • go语言处理JSON和XML数据示例解析
    • Golang中对json的优雅处理方式
    • 超详细Go语言中JSON处理技巧分享
    • Go处理JSON数据的实现
    • Go语言的JSON处理详解

    站内搜索