Go語言中處理JSON字符串轉(zhuǎn)換的常見方式
在 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)
- 字段標(biāo)簽:使用
json:"field_name"標(biāo)簽來指定 JSON 字段名 - 錯(cuò)誤處理:始終檢查
json.Unmarshal和json.Marshal的返回值 - 類型匹配:確保 JSON 數(shù)據(jù)類型與 Go 結(jié)構(gòu)體字段類型匹配
- 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)
之前的文章詳細(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ù)類型,用于高效地存儲(chǔ)和管理鍵值對(duì),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12
Go底層channel實(shí)現(xiàn)原理及示例詳解
這篇文章主要介紹了Go底層channel實(shí)現(xiàn)原理及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
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介紹,本文同時(shí)對(duì)比了Fiddler、Charles等抓包軟件,需要的朋友可以參考下2015-03-03

