Go语言中处理JSON字符串转换的常见方式

 更新时间:2025年09月19日 09:08:16   作者:学亮编程手记  
这篇文章主要介绍了Go语言中处理JSON字符串转换的常见方法,这些方法覆盖了 Go 语言中处理 JSON 字符串的常见场景,你可以根据具体需求选择合适的方式,需要的朋友可以参考下

在 Go 语言中,处理 JSON 字符串数据主要有以下几种方式:

1. 将 JSON 字符串转换为结构体

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

type User struct {
    Name  string `json:"name"`
    Age   int    `json:"age"`
    Email string `json:"email,omitempty"`
}

func main() {
    jsonStr := `{"name":"张三","age":25,"email":"zhangsan@example.com"}`

    var user User
    err := json.Unmarshal([]byte(jsonStr), &user)
    if err != nil {
        log.Fatal("JSON 解析错误:", err)
    }

    fmt.Printf("姓名: %s, 年龄: %d, 邮箱: %s\n", user.Name, user.Age, user.Email)
}

2. 将 JSON 字符串转换为 map

func jsonToMap() {
    jsonStr := `{"name":"李四","age":30,"hobbies":["读书","游泳"]}`

    var data map[string]interface{}
    err := json.Unmarshal([]byte(jsonStr), &data)
    if err != nil {
        log.Fatal("JSON 解析错误:", err)
    }

    fmt.Println("姓名:", data["name"])
    fmt.Println("年龄:", data["age"])
    
    // 处理数组类型的值
    if hobbies, ok := data["hobbies"].([]interface{}); ok {
        fmt.Println("爱好:")
        for _, hobby := range hobbies {
            fmt.Println(" -", hobby)
        }
    }
}

3. 将结构体转换为 JSON 字符串

func structToJson() {
    user := User{
        Name: "王五",
        Age:  28,
        Email: "wangwu@example.com",
    }

    jsonBytes, err := json.Marshal(user)
    if err != nil {
        log.Fatal("JSON 编码错误:", err)
    }

    jsonStr := string(jsonBytes)
    fmt.Println("JSON 字符串:", jsonStr)
}

4. 使用 json.RawMessage 处理未知结构的 JSON

func handleRawJSON() {
    jsonStr := `{
        "type": "user",
        "data": {"name":"赵六","age":35},
        "metadata": {"created_at":"2023-01-01"}
    }`

    var rawData map[string]json.RawMessage
    err := json.Unmarshal([]byte(jsonStr), &rawData)
    if err != nil {
        log.Fatal("JSON 解析错误:", err)
    }

    // 根据类型动态解析
    var typeStr string
    json.Unmarshal(rawData["type"], &typeStr)
    
    if typeStr == "user" {
        var user User
        json.Unmarshal(rawData["data"], &user)
        fmt.Println("用户数据:", user)
    }
}

5. 处理复杂的嵌套 JSON

type Address struct {
    City    string `json:"city"`
    Country string `json:"country"`
}

type Person struct {
    Name    string   `json:"name"`
    Age     int      `json:"age"`
    Address Address  `json:"address"`
    Tags    []string `json:"tags"`
}

func complexJSON() {
    jsonStr := `{
        "name": "钱七",
        "age": 40,
        "address": {
            "city": "北京",
            "country": "中国"
        },
        "tags": ["经理", "技术"]
    }`

    var person Person
    err := json.Unmarshal([]byte(jsonStr), &person)
    if err != nil {
        log.Fatal("JSON 解析错误:", err)
    }

    fmt.Printf("姓名: %s\n年龄: %d\n城市: %s\n标签: %v\n",
        person.Name, person.Age, person.Address.City, person.Tags)
}

6. 使用 json.Decoder 处理流式 JSON

func streamJSON() {
    jsonStr := `{"name":"孙八","age":45}{"name":"周九","age":50}`
    reader := strings.NewReader(jsonStr)
    decoder := json.NewDecoder(reader)

    for {
        var user User
        if err := decoder.Decode(&user); err != nil {
            if err == io.EOF {
                break
            }
            log.Fatal("解码错误:", err)
        }
        fmt.Printf("流式读取: %+v\n", user)
    }
}

注意事项

  1. 字段标签:使用 json:"field_name" 标签来指定 JSON 字段名
  2. 错误处理:始终检查 json.Unmarshaljson.Marshal 的返回值
  3. 类型匹配:确保 JSON 数据类型与 Go 结构体字段类型匹配
  4. omitempty:使用 omitempty 标签在序列化时忽略空值

常用技巧

// 美化输出 JSON
func prettyJSON() {
    user := User{Name: "郑十", Age: 55}
    jsonBytes, _ := json.MarshalIndent(user, "", "  ")
    fmt.Println(string(jsonBytes))
}

// 检查字段是否存在
func checkFieldExists() {
    jsonStr := `{"name":"吴十一"}`
    var data map[string]interface{}
    json.Unmarshal([]byte(jsonStr), &data)
    
    if age, exists := data["age"]; exists {
        fmt.Println("年龄:", age)
    } else {
        fmt.Println("年龄字段不存在")
    }
}

这些方法覆盖了 Go 语言中处理 JSON 字符串的常见场景,你可以根据具体需求选择合适的方式。

到此这篇关于Go语言中处理JSON字符串转换的常见方式的文章就介绍到这了,更多相关Go处理JSON字符串转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go实现基于RSA加密算法的接口鉴权

    Go实现基于RSA加密算法的接口鉴权

    这篇文章主要介绍了Go实现基于RSA加密算法的接口鉴权,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • Golang中的同步工具sync.WaitGroup详解

    Golang中的同步工具sync.WaitGroup详解

    这篇文章主要详细为大家介绍了Golang中的同步工具sync.WaitGroup,文中有详细的代码示例,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧
    2023-05-05
  • 关于golang test缓存问题

    关于golang test缓存问题

    这篇文章主要介绍了关于golang test缓存问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • GO语言延迟函数defer用法分析

    GO语言延迟函数defer用法分析

    这篇文章主要介绍了GO语言延迟函数defer用法,较为详细的分析了GO语言的特性与具体用法,并给出了一个比较典型的应用实例,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • Go语言利用ssh连接服务器的方法步骤

    Go语言利用ssh连接服务器的方法步骤

    这篇文章主要介绍了Go语言利用ssh连接服务器的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Go中的 = 和 := 区别小结

    Go中的 = 和 := 区别小结

    在Go语言编程中,"="用于给已声明的变量赋值,而":="同时声明并初始化变量,只能在函数内使用,理解这两者的不同,有助于编写更清晰的代码,下面就来介绍一下
    2024-10-10
  • go语言实现同步操作项目示例

    go语言实现同步操作项目示例

    本文主要介绍了go语言实现同步操作项目示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 如何使用腾讯云go sdk 查询对象存储中最新文件

    如何使用腾讯云go sdk 查询对象存储中最新文件

    这篇文章主要介绍了使用腾讯云go sdk 查询对象存储中最新文件,这包括如何创建COS客户端,如何逐页检索对象列表,并如何对结果排序以找到最后更新的对象,我们还展示了如何优化用户体验,通过实时进度更新和检索多个文件来改进程序,需要的朋友可以参考下
    2024-03-03
  • Golang并发编程之GMP模型详解

    Golang并发编程之GMP模型详解

    传统的并发编程模型是基于线程和共享内存的同步访问控制的,共享数据受锁的保护,线程将争夺这些锁以访问数据。本文将介绍Go并发编程中的GMP模型,感兴趣的可以了解一下
    2023-03-03
  • 如何让shell终端和goland控制台输出彩色的文字

    如何让shell终端和goland控制台输出彩色的文字

    这篇文章主要介绍了如何让shell终端和goland控制台输出彩色的文字的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05

最新评论