封送和解封JSON的基礎知識
JSON代表JavaScript對象表示法,這是交換結構化數據的一種非常方便的方法。而且它非常流行,尤其是在與API交互時。
Go在其標準庫中提供了對JSON的頂級支持,這encoding/json
包裹。
與鬆散類型的語言相比,解碼JSON更為複雜。在JavaScript中,您所需要做的就是JSON.parse()
。 Python有json.loads()
,而PHP具有json_decode()
。它們只是轉儲值而沒有問題,但是要進行強類型化,您需要做更多的工作來匹配類型。
JSON具有3種基本類型:布爾值,數字,弦樂,結合使用數組和對象建立復雜的結構。
Go的術語調用元帥從數據結構生成JSON字符串的過程,以及解組將JSON解析為數據結構的行為。
JSON字符串
input := `{"firstname": "Bill", "surname": "Gates"}`
解組JSON
這是一個取自JSON的示例Mozilla的MDN
{
"squadName": "Super hero squad",
"homeTown": "Metro City",
"formed": 2016,
"secretBase": "Super tower",
"active": true,
"members": [
{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": [
"Radiation resistance",
"Turning tiny",
"Radiation blast"
]
},
{
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": [
"Million tonne punch",
"Damage resistance",
"Superhuman reflexes"
]
},
{
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": [
"Immortality",
"Heat Immunity",
"Inferno",
"Teleportation",
"Interdimensional travel"
]
}
]
}
我們如何將其解析為Go數據結構?當然,我們需要一個匹配的數據結構。我們有5種基本類型和一系列對象。讓我們從基本類型開始:
type squad struct {
SquadName string
HomeTown string
Formed int
SecretBase string
Active bool
}
我們需要將JSON定義為[]byte
, 像這樣:
input := []byte(`
{
"squadName": "Super hero squad",
[...]
}
`)
我們可以將JSON解組到一個小隊實例:
s := squad{}
err := json.Unmarshal(input, &s)
if err != nil {
panic(err)
}
fmt.Printf("%v", s)
這將打印
{Super hero squad Metro City 2016 Super tower true}
請注意,對於JSON值與結構之間缺少匹配的抱怨,我們沒有任何錯誤,它們將被忽略。
讓我們確保json.Unmarshal()將獲得我們所有的字段,其中包括:
type squad struct {
SquadName string
HomeTown string
Formed int
SecretBase string
Active bool
Members []Member
}
type Member struct {
Name string
Age int
SecretIdentity string
Powers []string
}
請記住在您的結構中具有公共(大寫)屬性。
重命名JSON字段名稱
在這種情況下,一切都很好,因為JSON具有兼容的文件名。如果要將JSON映射到結構中的其他字段怎麼辦?
例如,如果將會員名稱傳遞為member_name
,但您希望將其存儲在Name
反而?
使用以下語法:
type Member struct {
Name string `json:"member_name"`
}
忽略JSON字段
使用以下語法:
type Member struct {
Name string `json:"-"`
}
封送/取消封送時,“名稱”字段將被忽略。
轉換JSON字段類型
您可以使用標記來註釋將JSON轉換為的類型:
type Member struct {
Age int `json:"age,string"`
}
成員結構具有一個Age
表示為int
。如果您希望它成為一個string
相反,但JSON傳遞了int
?
使用類型註釋:
type Member struct {
Age json.Number `json:"age,Number"`
}
Number類型是以下項的別名string
。
了解有關中的標籤的更多信息轉到標籤說明
元帥JSON
現在,我們可能想從我們的數據結構中構建一個JSON字符串。例如,這可能是一個使用國家/地區代碼並以JSON格式返回相應國家/地區詳細信息的程序。
package main
import (
“encoding/json”
“fmt”
)
type country struct {
Name string
}
func main() {
country_code := “US”
<span style="color:#a6e22e">the_country</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">country</span>{}
<span style="color:#66d9ef">switch</span> <span style="color:#a6e22e">country_code</span> {
<span style="color:#66d9ef">case</span> <span style="color:#e6db74">"US"</span>:
<span style="color:#a6e22e">the_country</span>.<span style="color:#a6e22e">Name</span> = <span style="color:#e6db74">"United States"</span>
}
<span style="color:#a6e22e">c</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">json</span>.<span style="color:#a6e22e">Marshal</span>(<span style="color:#a6e22e">the_country</span>)
<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
panic(<span style="color:#a6e22e">err</span>)
}
<span style="color:#75715e">// c is now a []byte containing the encoded JSON
fmt.Print(string(c))
}
執行後,該程序將打印{"Name":"United States"}
。
json.Marshal()
返回一個[]byte
,因此在傳遞給時必須將其轉換為字符串fmt.Print()
,否則您會看到一個看起來毫無意義的數字列表(但它們是有意義的,因為它們是組成字符串的實際字節)。
json.Marshal()
將正確處理基本類型和合成類型,例如切片和地圖。
閱讀更多
閱讀更多在圍棋博客上和在這encoding/json
打包文件
更多教程:
- 使用NGINX反向代理服務Go服務
- 在Go中復制結構
- Go Web服務器的基礎
- 在Go中對地圖類型進行排序
- 簡而言之去指針
- 轉到標籤說明
- 開始日期和時間格式
- 使用Go進行JSON處理
- 可變參數函數
- 去弦備忘單
- 轉到空界面說明
- 使用VS Code和Delve調試Go
- 命名為Go返回參數
- 在Go中生成隨機數和字符串
- Go項目的文件系統結構
- Go中的二進制搜索算法
- 在Go中使用命令行標誌
- GOPATH解釋
- 使用Go構建一個命令行應用程序:lolcat
- 使用Go構建CLI命令:Cowsay
- 在Go中使用殼管
- Go CLI教程:財富克隆
- 使用Go列出文件夾中的文件
- 使用Go從GitHub獲取存儲庫列表
- 去,將一小段字符串附加到文件中
- 去,將字符串轉換為字節片
- 使用Go可視化您本地的Git貢獻
- Go CPU和內存分析入門
- 解決Go程序中的“不支持索引”錯誤
- 測量Go程序中的執行時間
- 使用Go構建Web爬網程序以檢測重複的標題
- 最佳實踐:指針還是價值接收者?
- 最佳實踐:您應該使用方法還是函數?
- Go數據結構:集
- 前往地圖備忘單
- 在Go中生成泛型類型的實現
- Go數據結構:字典
- Go數據結構:哈希表
- 在“通過通道”中實現事件偵聽器
- Go數據結構:堆棧
- Go數據結構:隊列
- Go數據結構:二進制搜索樹
- Go數據結構:圖形
- Go數據結構:鍊錶
- Go數據結構的完整指南
- 比較Go值
- Go是面向對象的嗎?
- 在Go中使用SQL數據庫
- 在Go中使用環境變量
- 上篇教程:PostgreSQL支持的REST API
- 在Go Web服務器上啟用CORS
- 在Docker容器中部署Go應用程序
- 為什麼Go是作為PHP開發人員學習的功能強大的語言
- 去,刪除io.Reader.ReadString換行符
- 開始,如何觀看更改並重建程序
- 去算一下自約會以來的月份
- 在Go中訪問HTTP POST參數