Golang中将结构体序列化为JSON的方法
Golang中将结构体序列化为JSON的方法 如何将结构体的结构体转换为JSON?
4 回复
我需要类似标准序列化填充结构体的结果,但要字段类型而非实际值
更多关于Golang中将结构体序列化为JSON的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你能举个例子吗?你的结构体是什么样的,你往里面放了什么数据,你希望结果看起来是什么样的?
只要每个嵌套结构体本身都是可序列化的,你也可以直接序列化嵌套结构体。
// 示例代码
type Inner struct {
Field string `json:"field"`
}
type Outer struct {
Inner Inner `json:"inner"`
}
在Go语言中,将结构体序列化为JSON非常简单,主要使用标准库中的encoding/json包。以下是几种常见的方法和示例代码:
1. 基本序列化
使用json.Marshal()函数将结构体转换为JSON字节切片,然后可以转换为字符串。
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
p := Person{Name: "Alice", Age: 30}
jsonData, err := json.Marshal(p)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(jsonData)) // 输出: {"name":"Alice","age":30}
}
2. 格式化输出
使用json.MarshalIndent()函数生成格式化的JSON,便于阅读。
func main() {
p := Person{Name: "Bob", Age: 25}
jsonData, err := json.MarshalIndent(p, "", " ")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(jsonData))
// 输出:
// {
// "name": "Bob",
// "age": 25
// }
}
3. 处理嵌套结构体
如果结构体包含嵌套结构体或切片,json.Marshal()会自动递归处理。
type Address struct {
City string `json:"city"`
Country string `json:"country"`
}
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Address Address `json:"address"`
Hobbies []string `json:"hobbies"`
}
func main() {
user := User{
Name: "Charlie",
Age: 28,
Address: Address{City: "New York", Country: "USA"},
Hobbies: []string{"reading", "gaming"},
}
jsonData, _ := json.MarshalIndent(user, "", " ")
fmt.Println(string(jsonData))
// 输出:
// {
// "name": "Charlie",
// "age": 28,
// "address": {
// "city": "New York",
// "country": "USA"
// },
// "hobbies": [
// "reading",
// "gaming"
// ]
// }
}
4. 忽略空字段
使用omitempty标签选项,可以在字段为零值时忽略该字段。
type Product struct {
Name string `json:"name"`
Price float64 `json:"price,omitempty"`
InStock bool `json:"in_stock,omitempty"`
}
func main() {
p := Product{Name: "Laptop", Price: 0.0, InStock: false}
jsonData, _ := json.MarshalIndent(p, "", " ")
fmt.Println(string(jsonData))
// 输出:
// {
// "name": "Laptop"
// }
}
5. 自定义字段名
通过json标签可以指定JSON输出中的字段名。
type Employee struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
Salary int `json:"annual_salary"`
}
func main() {
emp := Employee{FirstName: "John", LastName: "Doe", Salary: 50000}
jsonData, _ := json.MarshalIndent(emp, "", " ")
fmt.Println(string(jsonData))
// 输出:
// {
// "first_name": "John",
// "last_name": "Doe",
// "annual_salary": 50000
// }
}
这些方法覆盖了Go语言中将结构体序列化为JSON的常见场景。使用encoding/json包可以高效且灵活地处理JSON数据。

