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字符串转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 源码剖析Golang中map扩容底层的实现

    源码剖析Golang中map扩容底层的实现

    之前的文章详细介绍过Go切片和map的基本使用,以及切片的扩容机制。本文针对map的扩容,会从源码的角度全面的剖析一下map扩容的底层实现,需要的可以参考一下
    2023-03-03
  • Go中map数据类型的实现

    Go中map数据类型的实现

    本文介绍了Go语言中的map数据类型,用于高效地存储和管理键值对,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • 源码剖析Golang如何fork一个进程

    源码剖析Golang如何fork一个进程

    创建一个新进程分为两个步骤,一个是fork系统调用,一个是execve 系统调用,本文将从源码的角度带大家剖析一下Golang是如何fork一个进程的
    2023-06-06
  • Go基础系列:Go切片(分片)slice详解

    Go基础系列:Go切片(分片)slice详解

    这篇文章主要介绍了Go语言中的切片(分片)slice详细说明 ,需要的朋友可以参考下
    2022-04-04
  • Go+Gin实现安全多文件上传功能

    Go+Gin实现安全多文件上传功能

    这篇文章主要为大家详细介绍了Go如何利用Gin框架实现安全多文件上传功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • Go底层channel实现原理及示例详解

    Go底层channel实现原理及示例详解

    这篇文章主要介绍了Go底层channel实现原理及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go1.18都出泛型了速来围观

    Go1.18都出泛型了速来围观

    泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型,本文通过例子给大家介绍下如何使用泛型,对Go1.18泛型相关知识感兴趣的朋友一起看看吧
    2022-03-03
  • 详解Go语言中Validator库的使用方法和用途

    详解Go语言中Validator库的使用方法和用途

    github.com/go-playground/validator 是一个 Go 语言的库,用于对结构体字段进行验证,它提供了一种简单而灵活的方式来定义验证规则,在这篇文章中,我们将从一个简单的问题出发,带你了解 Validator 库的用途,也会介绍Validator 的基本使用
    2023-09-09
  • golang对etcd存取和数值监测的实现

    golang对etcd存取和数值监测的实现

    这篇文章主要介绍了golang对etcd存取和数值监测的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • GO语言实现的http抓包分析工具pproxy介绍

    GO语言实现的http抓包分析工具pproxy介绍

    这篇文章主要介绍了GO语言实现的http抓包分析工具pproxy介绍,本文同时对比了Fiddler、Charles等抓包软件,需要的朋友可以参考下
    2015-03-03

最新评论