Go語(yǔ)言中常用json處理操作小結(jié)
在 Go 中,你可以使用內(nèi)置的 encoding/json 包來(lái)處理 JSON 格式數(shù)據(jù)。該包提供了函數(shù)和類(lèi)型,使你能夠?qū)?JSON 數(shù)據(jù)解析為 Go 對(duì)象(反序列化)或?qū)?Go 對(duì)象轉(zhuǎn)換為 JSON 數(shù)據(jù)(序列化)。
下面是一些常見(jiàn)的 JSON 處理操作:
反序列化(解析 JSON)
使用 json.Unmarshal 函數(shù)將 JSON 數(shù)據(jù)解析為 Go 對(duì)象。該函數(shù)接受一個(gè)包含 JSON 數(shù)據(jù)的字節(jié)切片和一個(gè)指向目標(biāo) Go 對(duì)象的指針,并將 JSON 數(shù)據(jù)映射到指定的 Go 對(duì)象上。
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
jsonData := []byte(`{"name":"John", "age":30}`)
var person Person
err := json.Unmarshal(jsonData, &person)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
}
序列化(將 Go 對(duì)象轉(zhuǎn)換為 JSON)
使用 json.Marshal 函數(shù)將 Go 對(duì)象轉(zhuǎn)換為 JSON 數(shù)據(jù)。該函數(shù)接受一個(gè) Go 對(duì)象,并返回表示該對(duì)象的 JSON 字節(jié)切片。
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
person := Person{
Name: "John",
Age: 30,
}
jsonData, err := json.Marshal(person)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(jsonData))
}
處理嵌套結(jié)構(gòu)和數(shù)組
在 Go 中,你可以使用結(jié)構(gòu)體嵌套和切片/數(shù)組來(lái)處理復(fù)雜的 JSON 數(shù)據(jù)結(jié)構(gòu)。通過(guò)在結(jié)構(gòu)體字段上添加 json 標(biāo)簽,可以指定 JSON 數(shù)據(jù)中的鍵名。
package main
import (
"encoding/json"
"fmt"
)
type Address struct {
City string `json:"city"`
State string `json:"state"`
}
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Address []Address `json:"address"`
}
func main() {
jsonData := []byte(`{"name":"John", "age":30, "address":[{"city":"New York","state":"NY"},{"city":"San Francisco","state":"CA"}]}`)
var person Person
err := json.Unmarshal(jsonData, &person)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
fmt.Println("Address:", person.Address)
}
以上示例展示了如何在 Go 中處理 JSON 數(shù)據(jù)。你可以根據(jù)實(shí)際需求定義自己的數(shù)據(jù)結(jié)構(gòu),并使用 json 標(biāo)簽進(jìn)行字段映射。
讀取 JSON 文件
- 使用 os 和 io/ioutil 包來(lái)讀取 JSON 文件的內(nèi)容,并將其存儲(chǔ)為字節(jié)切片。
- 使用 json.Unmarshal 函數(shù)將字節(jié)切片解析為 Go 對(duì)象。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
file, err := os.Open("data.json")
if err != nil {
fmt.Println("Error:", err)
return
}
defer file.Close()
jsonData, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println("Error:", err)
return
}
var person Person
err = json.Unmarshal(jsonData, &person)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Name:", person.Name)
fmt.Println("Age:", person.Age)
}
在上述示例中,我們打開(kāi)名為 data.json 的 JSON 文件,并將其內(nèi)容讀取為字節(jié)切片。然后,我們使用 json.Unmarshal 將字節(jié)切片解析為 Person 對(duì)象。
寫(xiě)入 JSON 文件
- 使用 os 和 io/ioutil 包來(lái)創(chuàng)建或打開(kāi)要寫(xiě)入的 JSON 文件。
- 使用 json.MarshalIndent 函數(shù)將 Go 對(duì)象轉(zhuǎn)換為帶縮進(jìn)的 JSON 字節(jié)切片。
- 使用 ioutil.WriteFile 函數(shù)將 JSON 字節(jié)切片寫(xiě)入 JSON 文件。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
person := Person{
Name: "John",
Age: 30,
}
jsonData, err := json.MarshalIndent(person, "", " ")
if err != nil {
fmt.Println("Error:", err)
return
}
err = ioutil.WriteFile("output.json", jsonData, 0644)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("JSON file created.")
}
在上述示例中,我們創(chuàng)建一個(gè)名為 output.json 的 JSON 文件,并將 Person 對(duì)象轉(zhuǎn)換為帶縮進(jìn)的 JSON 字節(jié)切片。然后,我們使用 ioutil.WriteFile 將 JSON 字節(jié)切片寫(xiě)入文件。
到此這篇關(guān)于Go語(yǔ)言中常用json處理操作小結(jié)的文章就介紹到這了,更多相關(guān)Go json處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言基礎(chǔ)if條件語(yǔ)句用法及示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)if條件語(yǔ)句的用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11
Golang拾遺之實(shí)現(xiàn)一個(gè)不可復(fù)制類(lèi)型詳解
在這篇文章中我們將實(shí)現(xiàn)一個(gè)無(wú)法被復(fù)制的類(lèi)型,順便加深對(duì)引用類(lèi)型、值傳遞以及指針的理解。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-02-02
golang時(shí)間/時(shí)間戳的獲取與轉(zhuǎn)換實(shí)例代碼
說(shuō)實(shí)話,golang的時(shí)間轉(zhuǎn)化還是很麻煩的,最起碼比php麻煩很多,下面這篇文章主要給大家介紹了關(guān)于golang時(shí)間/時(shí)間戳的獲取與轉(zhuǎn)換的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
go?zero微服務(wù)實(shí)戰(zhàn)處理每秒上萬(wàn)次的下單請(qǐng)求
這篇文章主要為大家介紹了go?zero微服務(wù)實(shí)戰(zhàn)處理每秒上萬(wàn)次的下單請(qǐng)求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
golang開(kāi)啟mod后import報(bào)紅的簡(jiǎn)單解決方案
這篇文章主要給大家介紹了關(guān)于golang開(kāi)啟mod后import報(bào)紅的簡(jiǎn)單解決方案,文中通過(guò)圖文將解決的辦法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01

