如何在Go 中處理JSON

閱讀時間約 11 分鐘


raw-image

👨‍💻 簡介

今天的encoding/json package是我日常在開發web時很常用到的package之一,主要是用來將Go struct和 JSON 之間進行轉換。主要功能為資料序列化(marshalling)和反序列化(unmarshalling)。

主要功能

encoding/json package 主要用來將 Go struct轉換為 JSON 格式(marshalling)以及將 JSON 資料轉換為 Go struct(unmarshalling)。以下是一些主要功能:

將 Go struct轉換為 JSON

使用 json.Marshal 函數可以將 Go struct轉換為 JSON 格式的資料。

package main

import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
person := Person{Name: "Alan", Age: 25}
jsonData, err := json.Marshal(person)
if err != nil {
fmt.Println("JSON 編碼失敗:", err)
return
}

fmt.Println(string(jsonData))
// 輸出: {"name":"Alan","age":25}
}

在上面的範例中,我們先定義了一個 Person struct,然後使用 json.Marshal 函數將 Person 轉換為 JSON 資料。

將 JSON 資料轉換為 Go struct

使用 json.Unmarshal 函數可以將 JSON 資料轉換為 Go struct。

package main

import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
jsonData := []byte(`{"name":"Bob","age":30}`)
var person Person

err := json.Unmarshal(jsonData, &person)
if err != nil {
fmt.Println("JSON 解碼失敗:", err)
return
}

fmt.Println("姓名:", person.Name)
fmt.Println("年齡:", person.Age)
// 輸出:
// 姓名: Bob
// 年齡: 30
}

反轉則是使用 json.Unmarshal 函數將 JSON 資料轉換為 Person 的struct。

自定義 JSON 鍵名

當需要API顯示自定義 JSON 欄位鍵名時,可以在 Go struct的欄位上使用 json 標籤來自定義 JSON 鍵名,方便與外部 API 或其他系統的格式相同。

package main

import (
"encoding/json"
"fmt"
)
type Person struct {
FullName string `json:"full_name"`
Age int `json:"age"`
}
func main() {
person := Person{FullName: "Charlie Brown", Age: 10}
jsonData, err := json.Marshal(person)
if err != nil {
fmt.Println("JSON 編碼失敗:", err)
return
}

fmt.Println(string(jsonData))
// 輸出: {"full_name":"Charlie Brown","age":10}
}

在這個範例中,我們使用 json 標籤來指定 FullName 欄位在 JSON 中的名稱為 “full_name”。

常見用法

解析複雜的 JSON 資料

encoding/json package 可以處理複雜的 JSON 資料,包括嵌套struct和陣列。

package main

import (
"encoding/json"
"fmt"
)
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"`
}
func main() {
jsonData := []byte(`{ "name": "Alan", "age": 25, "address": { "city": "Taichung", "country": "Taiwan" } }`)

var person Person

err := json.Unmarshal(jsonData, &person)
if err != nil {
fmt.Println("JSON 解碼失敗:", err)
return
}

fmt.Println("姓名:", person.Name)
fmt.Println("年齡:", person.Age)
fmt.Println("地址:", person.Address.Country,person.Address.City )
// 輸出:
// 姓名: Alan
// 年齡: 25
// 地址: Taiwan Taichung
}

在這個範例中,我們定義了 AddressPerson 兩個struct,其中 Person 包含一個嵌套的 Address struct。我們使用 json.Unmarshal 函數解析嵌套struct的 JSON 資料。

處理 JSON 陣列

encoding/json package 也能夠處理 JSON 陣列。

package main

import (
"encoding/json"
"fmt"
)
type Item struct {
ID int `json:"id"`
Name string `json:"name"`
}
func main() {
jsonData := []byte(`[ {"id": 1, "name": "Item 1"}, {"id": 2, "name": "Item 2"}, {"id": 3, "name": "Item 3"} ]`)
var items []Item

err := json.Unmarshal(jsonData, &items)
if err != nil {
fmt.Println("JSON 解碼失敗:", err)
return
}
for _, item := range items {
fmt.Printf("ID: %d, 名稱: %s\n", item.ID, item.Name)
}
// 輸出:
// ID: 1, 名稱: Item 1
// ID: 2, 名稱: Item 2
// ID: 3, 名稱: Item 3
}

可以看到,我們定義了 Item struct,然後使用 json.Unmarshal 函數解析包含 JSON 陣列的 JSON 資料。

📚 參考資料

avatar-img
17會員
83內容數
golang
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Alan的開發者天地 的其他內容
👨‍💻簡介 要處理日期和時間,就必須知道這個Package -> time,Go提供了內建的timePackage。 今天主要介紹time的功能,包括時間操作、格式化等等,以及常見用法。
👨‍💻簡介 要印出Hello World,就會碰到這個Package -> fmt,今天來簡單整理一下fmt的作用、格式化的控制與常見用法。
👨‍💻簡介 昨天講到Goroutine的橋梁aka傳話筒 — Channel,那要怎麼知道對方有收到訊息,我的紙條有送到對方手上呢? 今天就是要來介紹幾種Goroutine的確定完成工作的幾種方式。
👨‍💻簡介 昨天講到Goroutine有稍微簡單介紹Channel,Channel是Go語言中極為重要的併發通訊機制,它就像是不同goroutines之間的話筒,允許它們安全地傳遞資料和信息。這個強大的工具使得Go語言在處理併發任務時非常優雅和高效。
👨‍💻簡介 在日常生活中,如果能同時做很多事情,效率肯定大大提升,那麼在Go語言中,該如何做到呢,答案就是今天的主角Goroutine了,在Go語言中,讓併發變得簡單的強大工具,今天就是來給他一個快速介紹。
👨‍💻簡介 當我們在宣告變數時,電腦會為該變數在記憶體中分配一個位置,然後將這個變數值儲存在這個位置上,需要讀取或修改這個變數值時,電腦是透過記憶體位置來存取這個值。 今天來簡單介紹一下go的Pointer,他的特性以及常見用法。
👨‍💻簡介 要處理日期和時間,就必須知道這個Package -> time,Go提供了內建的timePackage。 今天主要介紹time的功能,包括時間操作、格式化等等,以及常見用法。
👨‍💻簡介 要印出Hello World,就會碰到這個Package -> fmt,今天來簡單整理一下fmt的作用、格式化的控制與常見用法。
👨‍💻簡介 昨天講到Goroutine的橋梁aka傳話筒 — Channel,那要怎麼知道對方有收到訊息,我的紙條有送到對方手上呢? 今天就是要來介紹幾種Goroutine的確定完成工作的幾種方式。
👨‍💻簡介 昨天講到Goroutine有稍微簡單介紹Channel,Channel是Go語言中極為重要的併發通訊機制,它就像是不同goroutines之間的話筒,允許它們安全地傳遞資料和信息。這個強大的工具使得Go語言在處理併發任務時非常優雅和高效。
👨‍💻簡介 在日常生活中,如果能同時做很多事情,效率肯定大大提升,那麼在Go語言中,該如何做到呢,答案就是今天的主角Goroutine了,在Go語言中,讓併發變得簡單的強大工具,今天就是來給他一個快速介紹。
👨‍💻簡介 當我們在宣告變數時,電腦會為該變數在記憶體中分配一個位置,然後將這個變數值儲存在這個位置上,需要讀取或修改這個變數值時,電腦是透過記憶體位置來存取這個值。 今天來簡單介紹一下go的Pointer,他的特性以及常見用法。
你可能也想看
Google News 追蹤
解讀JSON 字串 首先,你需要使用 Python 的 json 模組來解讀JSON 字串。 JSON的基本結構: 由花括號 {} 包圍,內部是鍵值對的集合,每個鍵值對之間用逗號分隔。 鍵是字串類型,值可以是任何JSON支持的資料類型(字串、數字、布林值、陣列、物件或 null)。 {
Thumbnail
GOB Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。 遠端存取的要求條件 方法的類型可輸出 方法的本體可輸出 方法必須要有兩個參數是輸出或內建 方法的第二個參數是指標型 方法的返回類型為
Thumbnail
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
Thumbnail
JSON(JavaScript Object Notation)是一種用於資料交換的輕量級資料格式,通常用於網路應用程式之間的資料傳遞。 JSON的格式易於閱讀和撰寫,也易於解析和產生,因此它在開發中被廣泛使用。 JSON由兩種結構組成:物件(Object)和陣列(Array)。
Thumbnail
JSON 格式因為其輕巧、易於讀寫的特性,所以普遍應用於數據儲存。本文將介紹如何使用 Python 來讀取、處理、解析和修改 JSON 檔案。
Thumbnail
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
Thumbnail
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(
解讀JSON 字串 首先,你需要使用 Python 的 json 模組來解讀JSON 字串。 JSON的基本結構: 由花括號 {} 包圍,內部是鍵值對的集合,每個鍵值對之間用逗號分隔。 鍵是字串類型,值可以是任何JSON支持的資料類型(字串、數字、布林值、陣列、物件或 null)。 {
Thumbnail
GOB Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。 遠端存取的要求條件 方法的類型可輸出 方法的本體可輸出 方法必須要有兩個參數是輸出或內建 方法的第二個參數是指標型 方法的返回類型為
Thumbnail
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
Thumbnail
JSON(JavaScript Object Notation)是一種用於資料交換的輕量級資料格式,通常用於網路應用程式之間的資料傳遞。 JSON的格式易於閱讀和撰寫,也易於解析和產生,因此它在開發中被廣泛使用。 JSON由兩種結構組成:物件(Object)和陣列(Array)。
Thumbnail
JSON 格式因為其輕巧、易於讀寫的特性,所以普遍應用於數據儲存。本文將介紹如何使用 Python 來讀取、處理、解析和修改 JSON 檔案。
Thumbnail
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
Thumbnail
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(