在Go中处理JSON:面向初学者的解析与序列化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Go中JSON处理入门

\n\n

JSON(JavaScript对象表示法)是现代Web应用程序和微服务中最流行的数据交换格式之一。凭借其简单性和可读性,JSON已成为REST API、配置文件以及结构化数据存储的标准。

\n\n

Go语言(Golang)通过encoding/json包提供了内置的强大JSON支持。该包可以轻松地将Go结构体转换为JSON(序列化),以及将JSON转换回Go结构体(反序列化或解析)。

\n\n

在本文中,我们将探讨Go中JSON处理的基础知识:从简单示例到处理复杂的嵌套结构和错误。本材料面向已经熟悉Go基本语法的初学者开发者。

\n\n

序列化:将Go结构体转换为JSON

\n\n

序列化(编码)是将数据从Go内部表示(结构体、切片、映射)转换为JSON字符串的过程。在Go中,使用json.Marshal()函数。

\n\n

序列化基本示例

\n\n
package 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()将其转换为字符串。

\n\n

使用json.MarshalIndent进行格式化输出

\n\n

为了调试或输出可读格式,请使用json.MarshalIndent():

\n\n
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\n

Go不仅可以序列化结构体,还可以序列化其他数据类型:

\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\n

JSON解析:将JSON转换为Go结构体

\n\n

解析(反序列化)是相反的过程:从JSON字符串中获取Go结构体。使用json.Unmarshal()函数。

\n\n

解析为结构体

\n\n
package 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无法修改其字段。

\n\n

解析为map[string]interface{}

\n\n

如果数据结构事先未知,可以使用通用类型:

\n\n
jsonString := `{"name":"安娜","                

博客

书籍推荐