欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言中處理JSON字符串轉(zhuǎn)換的常見方式

 更新時(shí)間:2025年09月19日 09:08:16   作者:學(xué)亮編程手記  
這篇文章主要介紹了Go語言中處理JSON字符串轉(zhuǎn)換的常見方法,這些方法覆蓋了 Go 語言中處理 JSON 字符串的常見場(chǎng)景,你可以根據(jù)具體需求選擇合適的方式,需要的朋友可以參考下

在 Go 語言中,處理 JSON 字符串?dāng)?shù)據(jù)主要有以下幾種方式:

1. 將 JSON 字符串轉(zhuǎn)換為結(jié)構(gòu)體

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 解析錯(cuò)誤:", err)
    }

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

2. 將 JSON 字符串轉(zhuǎn)換為 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 解析錯(cuò)誤:", err)
    }

    fmt.Println("姓名:", data["name"])
    fmt.Println("年齡:", data["age"])
    
    // 處理數(shù)組類型的值
    if hobbies, ok := data["hobbies"].([]interface{}); ok {
        fmt.Println("愛好:")
        for _, hobby := range hobbies {
            fmt.Println(" -", hobby)
        }
    }
}

3. 將結(jié)構(gòu)體轉(zhuǎn)換為 JSON 字符串

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

    jsonBytes, err := json.Marshal(user)
    if err != nil {
        log.Fatal("JSON 編碼錯(cuò)誤:", err)
    }

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

4. 使用 json.RawMessage 處理未知結(jié)構(gòu)的 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 解析錯(cuò)誤:", err)
    }

    // 根據(jù)類型動(dòng)態(tài)解析
    var typeStr string
    json.Unmarshal(rawData["type"], &typeStr)
    
    if typeStr == "user" {
        var user User
        json.Unmarshal(rawData["data"], &user)
        fmt.Println("用戶數(shù)據(jù):", user)
    }
}

5. 處理復(fù)雜的嵌套 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": ["經(jīng)理", "技術(shù)"]
    }`

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

    fmt.Printf("姓名: %s\n年齡: %d\n城市: %s\n標(biāo)簽: %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("解碼錯(cuò)誤:", err)
        }
        fmt.Printf("流式讀取: %+v\n", user)
    }
}

注意事項(xiàng)

  1. 字段標(biāo)簽:使用 json:"field_name" 標(biāo)簽來指定 JSON 字段名
  2. 錯(cuò)誤處理:始終檢查 json.Unmarshaljson.Marshal 的返回值
  3. 類型匹配:確保 JSON 數(shù)據(jù)類型與 Go 結(jié)構(gòu)體字段類型匹配
  4. omitempty:使用 omitempty 標(biāo)簽在序列化時(shí)忽略空值

常用技巧

// 美化輸出 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 字符串的常見場(chǎng)景,你可以根據(jù)具體需求選擇合適的方式。

到此這篇關(guān)于Go語言中處理JSON字符串轉(zhuǎn)換的常見方式的文章就介紹到這了,更多相關(guān)Go處理JSON字符串轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 源碼剖析Golang中map擴(kuò)容底層的實(shí)現(xiàn)

    源碼剖析Golang中map擴(kuò)容底層的實(shí)現(xiàn)

    之前的文章詳細(xì)介紹過Go切片和map的基本使用,以及切片的擴(kuò)容機(jī)制。本文針對(duì)map的擴(kuò)容,會(huì)從源碼的角度全面的剖析一下map擴(kuò)容的底層實(shí)現(xiàn),需要的可以參考一下
    2023-03-03
  • Go中map數(shù)據(jù)類型的實(shí)現(xiàn)

    Go中map數(shù)據(jù)類型的實(shí)現(xiàn)

    本文介紹了Go語言中的map數(shù)據(jù)類型,用于高效地存儲(chǔ)和管理鍵值對(duì),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • 源碼剖析Golang如何fork一個(gè)進(jìn)程

    源碼剖析Golang如何fork一個(gè)進(jìn)程

    創(chuàng)建一個(gè)新進(jìn)程分為兩個(gè)步驟,一個(gè)是fork系統(tǒng)調(diào)用,一個(gè)是execve?系統(tǒng)調(diào)用,本文將從源碼的角度帶大家剖析一下Golang是如何fork一個(gè)進(jìn)程的
    2023-06-06
  • Go基礎(chǔ)系列:Go切片(分片)slice詳解

    Go基礎(chǔ)系列:Go切片(分片)slice詳解

    這篇文章主要介紹了Go語言中的切片(分片)slice詳細(xì)說明?,需要的朋友可以參考下
    2022-04-04
  • Go+Gin實(shí)現(xiàn)安全多文件上傳功能

    Go+Gin實(shí)現(xiàn)安全多文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了Go如何利用Gin框架實(shí)現(xiàn)安全多文件上傳功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • Go底層channel實(shí)現(xiàn)原理及示例詳解

    Go底層channel實(shí)現(xiàn)原理及示例詳解

    這篇文章主要介紹了Go底層channel實(shí)現(xiàn)原理及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go1.18都出泛型了速來圍觀

    Go1.18都出泛型了速來圍觀

    泛型允許程序員在強(qiáng)類型程序設(shè)計(jì)語言中編寫代碼時(shí)使用一些以后才指定的類型,在實(shí)例化時(shí)作為參數(shù)指明這些類型,本文通過例子給大家介紹下如何使用泛型,對(duì)Go1.18泛型相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-03-03
  • 詳解Go語言中Validator庫的使用方法和用途

    詳解Go語言中Validator庫的使用方法和用途

    github.com/go-playground/validator 是一個(gè) Go 語言的庫,用于對(duì)結(jié)構(gòu)體字段進(jìn)行驗(yàn)證,它提供了一種簡(jiǎn)單而靈活的方式來定義驗(yàn)證規(guī)則,在這篇文章中,我們將從一個(gè)簡(jiǎn)單的問題出發(fā),帶你了解 Validator 庫的用途,也會(huì)介紹Validator 的基本使用
    2023-09-09
  • golang對(duì)etcd存取和數(shù)值監(jiān)測(cè)的實(shí)現(xiàn)

    golang對(duì)etcd存取和數(shù)值監(jiān)測(cè)的實(shí)現(xiàn)

    這篇文章主要介紹了golang對(duì)etcd存取和數(shù)值監(jiān)測(cè)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • GO語言實(shí)現(xiàn)的http抓包分析工具pproxy介紹

    GO語言實(shí)現(xiàn)的http抓包分析工具pproxy介紹

    這篇文章主要介紹了GO語言實(shí)現(xiàn)的http抓包分析工具pproxy介紹,本文同時(shí)對(duì)比了Fiddler、Charles等抓包軟件,需要的朋友可以參考下
    2015-03-03

最新評(píng)論