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数据。

回到顶部