Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go处理JSON字符串转换

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

作者:学亮编程手记

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

您可能感兴趣的文章:
阅读全文