golang encoding/json 使用基礎

json 與 encoding/json

JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,它基于 ECMAScript(歐洲計算機協會制定的js規范)的一個子集,采用完全獨立于語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。json具有以下特點:

  • 易讀性:JSON 格式的數據易于閱讀和編寫,同時也易于機器解析和生成。
  • 輕量級:JSON 的數據格式非常簡單,使得數據的傳輸和存儲更加高效。
  • 跨語言:JSON 是一種中立的數據格式,可以被多種編程語言所支持。

encoding/json 是 Go 語言標準庫中的一個重要包,它提供了對 JSON 數據格式的編碼(序列化)和解碼(反序列化)支持;它使得 Go 語言能夠輕松、高效地處理 JSON 數據,使得開發者能夠方便地將 Go 數據結構序列化為 JSON 格式的字符串,或者將 JSON 字符串反序列化為 Go 的數據結構。

說明

提供的方法

Compact
func Compact(dst *bytes.Buffer, src []byte) error

作用:Compact函數會將src省略不重要的空格字符后追加到json編碼的src中。

HTMLEscape
func HTMLEscape(dst *bytes.Buffer, src []byte)

作用:在JSON編碼的src中附加<,>,&,U+2028 和 U+2029 字符,字符串字面量更改為 \u003c, \u003e, \u0026, \u2028, \u2029,以便JSON可以安全地嵌入HTML以及script標記中。由于歷史原因,web瀏覽器不支持script標簽內的標準HTML轉義,因此必須使用替代的JSON編碼。

Indent
func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error

Indent 函數接收一個 JSON 字節切片(通常是通過 Marshal 或 MarshalIndent 函數生成的),以及兩個字符串參數:prefix(前綴)和indext(縮進)字符串。函數返回一個新的字節切片,函數內部會將傳入其中的 JSON 數據重新格式化,為每個 JSON 對象的鍵和字符串值都添加前綴和縮進字符串。

Marshal
func Marshal(v any) ([]byte, error)

Marshal 函數用于將 Go 語言中的數據結構(如結構體、切片、映射等)序列化為 JSON 格式字節切片。函數接收一個 Go 語言的對象(可以是任何可以被編碼為 JSON 的類型)作為參數,返回一個將該對應值用 JSON 表示的字節切片。

Unmarshal
func Unmarshal(data []byte, v any) error

Unmarshal 函數用于將 JSON 格式的數據反序列化為 Go 語言的數據結構(如結構體、切片、映射等)。函數接收一個 JSON 格式的字節切片作為輸入,以及一個指向 Go 語言值的指針作為輸出目標,然后嘗試將 JSON 數據解析并填充到該值中。

Valid
func Valid(data []byte) bool

作用:檢測data是否有效。(這個函數在go1.9才添加)

提供的對象

(提供的這些對象都是比函數更靈活的,但是我目前要快速上手go項目,所以這里沒有仔細了解,暫時空著后續補充)

Decoder

Decoder 類型是一個用于從 I/O 流(如文件、網絡連接等)中讀取和解碼 JSON 數據的解碼器。Decoder 提供了比 Unmarshal 函數更靈活和高效的方式來處理 JSON 數據,特別是當需要從數據流中連續讀取多個 JSON 對象時。
Decoder 類型有一個 Decode 方法,它用于從輸入流中讀取并解碼下一個 JSON 編碼的值。可以將一個指向 Go 語言數據結構的指針作為 Decode 方法的參數,以便將解碼后的數據填充到該結構中。
使用 Decoder 的一個典型場景是處理從網絡連接中接收到的流式 JSON 數據,或者從文件中讀取包含多個 JSON 對象的數據。

Delim
Encoder
InvalidUTF8Error
InvalidUnmarshalError
Marshaler
MarshalerError
Number
RawMessage
SyntaxError
Token
UnmarshalerFieldError
UnmarshalerTypeError
Unmarshaler
UnsupportedTypeError
UnsupportedValueError

encoding/json 使用示例

package mainimport ("bytes""encoding/json""fmt"
)// 簡單json對象轉換測試
func jsonTest1() {fmt.Println("jsonTest1 begin")json1 := map[string]int{"cpp": 10,"js":  8,"go":  10,}bytes, _ := json.Marshal(json1)fmt.Println("基礎版go to json: ", string(bytes))if json.Valid(bytes) {var json2 map[string]intjson.Unmarshal(bytes, &json2)fmt.Println("基礎版json to go: ", json2)}
}// 復雜對象轉換測試
type Seller struct {Id          int    `json:"id"`Name        string `json:"name"`CountryCode string `json:"countrycode"`
}
type Product struct {Id     int    `json:"id"`Name   string `json:"name"`Seller Seller `json:"seller"`Price  int    `json:"price"`
}func jsonTest2() {fmt.Println("jsonTest2 begin")products := []Product{{Id:     50,Name:   "Writing Book",Seller: Seller{1, "ABC Company", "US"},Price:  100,},{Id:     51,Name:   "Kettle",Seller: Seller{20, "John Store", "DE"},Price:  500,},}bytes, _ := json.Marshal(products)fmt.Println("復雜對象 go to json: ", string(bytes))if json.Valid(bytes) {var json2 []Productjson.Unmarshal(bytes, &json2)fmt.Println("復雜對象 json to go: ", json2)}
}// compact 測試
func jsonTest3() {fmt.Println("jsonTest3 begin")var buf bytes.BufferjsonBytes := []byte(`{"cpp": 10,"js": 8,"go": 10}`)err := json.Compact(&buf, jsonBytes)if err != nil {fmt.Println("compact error : ", err.Error())return}fmt.Println("compact 對象 : ", buf.String())jsonBytes1 := []byte(`{"name":"John", "age":30, "city":"New York"}`)json.Indent(&buf, jsonBytes1, "", "  ")fmt.Println("indent 對象 : ", buf.String())
}func main() {jsonTest1()jsonTest2()jsonTest3()
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12797.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12797.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12797.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SDL系列(一)—— 小白入門

SDL &#xff08; Simple DirectMedia Layer &#xff09; 是一套開放源代碼的 跨平臺多媒體開發庫 &#xff0c;使用 C 語 言寫成。 SDL 提供了數種控制圖像、聲音、輸出入的函數&#xff0c;讓開發者只要用相同或是相似的 代碼就可以開發出 跨多個平臺&#xff08; Linu…

618有什么劃算的數碼產品?4款精選數碼好物清單分享,趕緊碼住!

隨著618購物節慢慢開始&#xff0c;數碼產品的大門已經向你敞開&#xff0c;等你來發現里面的各種樂趣。在這個購物的好時節&#xff0c;我們為你準備了一些很不錯的數碼東西&#xff0c;不管是喜歡新鮮科技的你&#xff0c;還是需要實用小工具的朋友們&#xff0c;這里都有可能…

安卓、iOS、iPad三端搞定,不再劇荒!

哈嘍&#xff0c;各位小伙伴們好&#xff0c;我是給大家帶來各類黑科技與前沿資訊的小武。 之前給大家推薦過各種看劇姿勢&#xff0c;但很多蘋果、平板端的小伙伴還是存在更好的需求體驗&#xff0c;今天給大家推薦這款可以在安卓、iOS和平板上都能安裝使用&#xff0c;不再劇…

2024自學網絡安全的三個必經階段(含路線圖)_網絡安全自學路線

一、為什么選擇網絡安全&#xff1f; 這幾年隨著我國《國家網絡空間安全戰略》《網絡安全法》《網絡安全等級保護2.0》等一系列政策/法規/標準的持續落地&#xff0c;網絡安全行業地位、薪資隨之水漲船高。 未來3-5年&#xff0c;是安全行業的黃金發展期&#xff0c;提前踏入…

基于Django的圖書管理系統

文章目錄 前言一、頁面展示1.登錄2.前端頁面3.后端頁面 總結 前言 本網站調用Django編寫了圖書管理網站&#xff0c;可以在后端控制書籍&#xff0c;前端進行書籍預覽 一、頁面展示 1.登錄 2.前端頁面 3.后端頁面 — ![在這里插入圖片描述](https://img-blog.csdnimg.cn/dir…

低功耗音頻編解碼器CJC8990

由工采網代理的CJC8990是一款低功耗音頻編解碼器&#xff0c;擁有先進的功能并提供高質量音頻&#xff0c;非常適合于便攜式數字音頻應用&#xff0c;支持多種音頻數據格式&#xff0c;包括I2S, DSP模式。 產品介紹&#xff1a; 該芯片工作電壓&#xff1a;1.5V&#xff5e;3…

甲方運營工具——安天威脅情報中心每日熱點事件爬取

一、背景 本次是采用python爬取安天威脅情報中心的每日熱點事件,進行甲方內部威脅情報同步的這樣一個需求開發。 界面及內容: 二、逐步實現 2.1、分析請求頁面的數據來源 通過請求頁面我們看到安天對于第三方引用這些內容的真實性等是不予負責的;我們看到該頁面的數據來源…

mysql 行轉列 case when 和 聚合函數實現

一、原始數據## 二、行轉列 第一步 SELECTCASE WHEN SUBSTRING( aaa.cost_code, 1, 3 ) 100 THEN aaa.budget_cost_budget ELSE 0 END b1,CASE WHEN SUBSTRING( aaa.cost_code, 1, 3 ) 300 THEN aaa.budget_cost_budget ELSE 0 END b2,CASE WHEN SUBSTRING( aaa.cost_cod…

Math.Round()函數說明

Math.Round()并不是嚴格意義上的是四舍五入函數。它默認的執行的是“銀行家舍入”算法&#xff0c;即四舍六入五取偶。概括為&#xff1a;四舍六入五考慮、五后非零就進一&#xff0c;五后皆零看奇偶&#xff0c;五前為偶應舍去、五前為奇要進一。 當為5時&#xff0c;取離著最…

數據庫第九次作業官方答案

文章目錄 1.12.12.22.32.4 1.1 列出下圖所示關系滿足的所有非平凡的函數依賴(忽略蘊含的函數依賴)。 A B C ? ? ? ? ? ? ? ? ? ? ? ? ------------ ???????????? a1 b1 c1 a1 b1 c2 a2 b1 c1 a2 b1 c3 非平凡的函數依賴有&#xff1a;A→B和C→B 2.1 …

淘寶店鋪運營爆流課:助你打造高流量店鋪,實現銷售持續增長(52節課)

課程目錄 01【開店類型第1課】貨架式店鋪.mp4 02【開店類型第2課】短視頻店鋪.mp4 03【開店類型第3課】直播型店鋪.mp4 04【店鋪基礎操作第1課】如何發布一個成功的寶貝.mp4 05【店鋪基礎操作第2課】商品SKU設置技巧及庫存設置方法.mp4 06【標題】如何制作一個爆款標題.mp…

微前端的概念

微前端是一種架構模式&#xff0c;用于構建單個現代web應用程序的多個小型獨立前端應用。每個前端應用都有自己的代碼庫、技術棧和團隊&#xff0c;并可以獨立開發、測試、部署和運行。這些小型前端應用被組合在一起以形成一個完整的前端應用程序。 微前端的核心思想是將前端應…

寄大件家具用什么物流便宜,寄沙發大件物流便宜

在現代生活中&#xff0c;搬家或重新布置家居時&#xff0c;沙發作為體積較大、價值較高的家具&#xff0c;選擇一個經濟實惠的物流服務至關重要。 1、對于近距離的運輸&#xff0c;同城寄沙發可以找個車直接拉過去比較劃算&#xff0c;省外的可以試試像我這樣郵寄&#xff1b;…

2244. 完成所有任務需要的最少輪數 --力扣 -- JAVA

題目 給你一個下標從 0 開始的整數數組 tasks &#xff0c;其中 tasks[i] 表示任務的難度級別。在每一輪中&#xff0c;你可以完成 2 個或者 3 個 相同難度級別 的任務。 返回完成所有任務需要的 最少 輪數&#xff0c;如果無法完成所有任務&#xff0c;返回 -1 。 解題思路 找…

手機怎么制作搞笑gif?來看看這一個方法

動態圖片是現在網絡中很流行的一種圖片格式&#xff0c;可以把多個jpg、png格式靜圖變成一張gif格式的動圖。在各大社交媒體中非常的受歡迎&#xff0c;用簡單快速的方法傳遞信息。當我們想要通過手機制作gif動畫的時候&#xff0c;要如何操作呢&#xff1f;這時候&#xff0c;…

Java后端面試常見問題

Java后端面試 經歷了兩個月的面試和準備&#xff0c;下面對常見的八股文進行總結。有些問題是網上看到的面經里提到的&#xff0c;有些是我真實面試過程遇到的。 異常 1、異常分為哪幾種&#xff1f;他們的父類是什么&#xff1f; 注意&#xff1a;所有異常對象的父類為Thr…

瑞_Docker安裝教程(超詳細圖文步驟,含卸載、離線安裝)

文章目錄 1 CentOS 在線安裝 Docker1.1 卸載舊版Docker1.2 安裝Docker1.2.1 安裝Docker的yum庫1.2.2 配置Docker的yum源1.2.3 安裝Docker-CE1.2.4 啟動和校驗&#xff08;開機自啟&#xff09;1.2.5 配置鏡像加速 1.3 安裝 Docker Compose1.4 啟動和校驗&#xff08;開機自啟&a…

Acrel-1000變電站綜合自動化監控系統 實時測控保護、遠動于一體

?一、 系統概述 1.1 概述 Acrel-1000 變電站綜合自動化監控系統&#xff0c;是我司根據電力系統自動化及無人值守的要求&#xff0c;總結國內外的研究和生產的先進經驗&#xff0c;專門研制出的新一代電力監控系統。本系統具有保護、遙測、遙信、遙脈、遙調、遙控功能&#x…

Python代碼:三、讀入字符串

1、題目 從變量輸出開始。請使用input函數讀入一個字符串&#xff0c;然后將其輸出。 2、代碼 import sys ainput() print(a) 3、在sublime運行的結果

DIYGW UniApp可視化工具:低代碼時代的前端開發新體驗

摘要&#xff1a; 隨著技術的不斷發展&#xff0c;前端開發領域也迎來了低代碼時代的浪潮。本文介紹了DIYGW UniApp可視化工具&#xff0c;這款工具以其傻瓜式、拖拽式、模塊化的特性&#xff0c;為前端開發者提供了一個全新的開發體驗。通過DIYGW UniApp&#xff0c;用戶無需深…