Go中JSON处理入门
\n\nJSON(JavaScript对象表示法)是现代Web应用程序和微服务中最流行的数据交换格式之一。凭借其简单性和可读性,JSON已成为REST API、配置文件以及结构化数据存储的标准。
\n\nGo语言(Golang)通过encoding/json包提供了内置的强大JSON支持。该包可以轻松地将Go结构体转换为JSON(序列化),以及将JSON转换回Go结构体(反序列化或解析)。
在本文中,我们将探讨Go中JSON处理的基础知识:从简单示例到处理复杂的嵌套结构和错误。本材料面向已经熟悉Go基本语法的初学者开发者。
\n\n序列化:将Go结构体转换为JSON
\n\n序列化(编码)是将数据从Go内部表示(结构体、切片、映射)转换为JSON字符串的过程。在Go中,使用json.Marshal()函数。
序列化基本示例
\n\npackage main\n\nimport (\n "encoding/json"\n "fmt"\n)\n\ntype Person struct {\n Name string\n Age int\n City string\n}\n\nfunc main() {\n person := Person{\n Name: "伊万·彼得罗夫",\n Age: 30,\n City: "莫斯科",\n }\n\n jsonBytes, err := json.Marshal(person)\n if err != nil {\n fmt.Println("序列化错误:", err)\n return\n }\n\n fmt.Println(string(jsonBytes))\n // 输出: {"Name":"伊万·彼得罗夫","Age":30,"City":"莫斯科"}\n}\n\n请注意:json.Marshal()返回一个字节切片([]byte),因此我们使用string()将其转换为字符串。
使用json.MarshalIndent进行格式化输出
\n\n为了调试或输出可读格式,请使用json.MarshalIndent():
jsonBytes, err := json.MarshalIndent(person, "", " ")\nif err != nil {\n fmt.Println("错误:", err)\n return\n}\nfmt.Println(string(jsonBytes))\n// 输出:\n// {\n// "Name": "伊万·彼得罗夫",\n// "Age": 30,\n// "City": "莫斯科"\n// }\n\n切片和映射的序列化
\n\nGo不仅可以序列化结构体,还可以序列化其他数据类型:
\n\n// 结构体切片\npeople := []Person{\n {Name: "安娜", Age: 25, City: "圣彼得堡"},\n {Name: "彼得", Age: 35, City: "喀山"},\n}\njsonBytes, _ := json.Marshal(people)\nfmt.Println(string(jsonBytes))\n// 输出: [{"Name":"安娜","Age":25,"City":"圣彼得堡"},{"Name":"彼得","Age":35,"City":"喀山"}]\n\n// 映射\nscores := map[string]int{"代数": 5, "物理": 4, "计算机科学": 5}\njsonBytes, _ = json.Marshal(scores)\nfmt.Println(string(jsonBytes))\n// 输出: {"代数":5,"计算机科学":5,"物理":4}\n\nJSON解析:将JSON转换为Go结构体
\n\n解析(反序列化)是相反的过程:从JSON字符串中获取Go结构体。使用json.Unmarshal()函数。
解析为结构体
\n\npackage main\n\nimport (\n "encoding/json"\n "fmt"\n)\n\ntype Person struct {\n Name string\n Age int\n City string\n}\n\nfunc main() {\n jsonString := `{"Name":"伊万·彼得罗夫","Age":30,"City":"莫斯科"}`\n\n var person Person\n err := json.Unmarshal([]byte(jsonString), &person)\n if err != nil {\n fmt.Println("解析错误:", err)\n return\n }\n\n fmt.Printf("姓名: %s, 年龄: %d, 城市: %s\\n", person.Name, person.Age, person.City)\n // 输出: 姓名: 伊万·彼得罗夫, 年龄: 30, 城市: 莫斯科\n}\n\n重要提示:传递结构体的指针(&person),否则Unmarshal无法修改其字段。
解析为map[string]interface{}
\n\n如果数据结构事先未知,可以使用通用类型:
\n\njsonString := `{"name":"安娜","