日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang中的json

發布時間:2025/6/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang中的json 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

編碼

結構體生成json

使用json.Marshal()函數可以對一組數據進行json格式的編碼.
json.Marshal()函數的聲明

func Marshal(v interface{}) ([] byte, error)

還有一個格式化輸出

//MarshalIndent很像Marshal, 只是用縮進對輸出進行格式化 func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)

Marshal

//成員變量名首字母必須大寫 type IT struct {Company stringSubjects []stringIsOk boolPrice float64 }func main() {//定義一個結構體變量,同時初始化s := IT{"abc", []string{"go", "cpp", "test"}, true, 66.66}//編碼,根據內容生成json文本buf, err := json.Marshal(s)if err != nil {fmt.Println("err = ", err)return}//要轉成字符串//{"Company":"abc","Subjects":["go","cpp","test"],"IsOk":true,"Price":66.66}fmt.Println(string(buf)) }

MarshalIndent

type IT struct {Company stringSubjects []stringIsOk boolPrice float64 }func main() {//定義一個結構體變量,同時初始化s := IT{"abc", []string{"go", "cpp", "test"}, true, 66.66}//編碼,第3個參數是縮進buf, err := json.MarshalIndent(s, "", " ")if err != nil {fmt.Println("err = ", err)return}//要轉成字符串fmt.Println(string(buf)) }

二次編碼

Go 語言中數據結構和 JSON 類型的對應關系如下表

有些時候,我們在序列化或者反序列化的時候,可能結構體類型和需要的類型不一致,這個時候可以指定,支持string,number和boolean

//成員變量名首字母必須大寫 type IT struct {Company string `json:"company"` //改名字Subjects []string `json:"sub"`IsOk bool `json:",string"` //轉成字符串Price float64 `json:"-"` //這個不會輸出 }func main() {//定義一個結構體變量,同時初始化s := IT{"abc", []string{"go", "cpp", "test"}, true, 66.66}//編碼,根據內容生成json文本buf, err := json.Marshal(s)if err != nil {fmt.Println("err = ", err)return}//要轉成字符串//{"company":"abc","sub":["go","cpp","test"],"IsOk":"true"}fmt.Println(string(buf)) } `json:"-"`

表示不進行序列化`

type Product struct {Name string `json:"name"`ProductID int64 `json:"-"` // 表示不進行序列化Number int `json:"number"`Price float64 `json:"price"`IsOnSale bool `json:"is_on_sale,string"` }// 序列化過后,可以看見{"name":"Xiao mi 6","number":10000,"price":2499,"is_on_sale":"false"}
  • omitempty:當字段為空(默認值)時,不要解析這個字段。比如 false、0、nil、長度為 0 的 array,map,slice,string
import ("encoding/json""fmt" )// Product _ type Product struct {Name string `json:"name"`ProductID int64 `json:"product_id,omitempty"` Number int `json:"number"`Price float64 `json:"price"`IsOnSale bool `json:"is_on_sale,omitempty"` }func main() {p := &Product{}p.Name = "Xiao mi 6"p.IsOnSale = falsep.Number = 10000p.Price = 2499.00p.ProductID = 0data, _ := json.Marshal(p)fmt.Println(string(data)) } // 結果 {"name":"Xiao mi 6","number":10000,"price":2499}

通過map生成json

func main() {//創建個mapm := make(map[string]interface{}, 4)m["company"] = "abc"m["sub"] = []string{"go", "c++", "test"}m["isok"] = truem["price"] = 6.66//編碼成jsonres, err:= json.MarshalIndent(m, "", " ")if err != nil {fmt.Println(err)return}fmt.Println(string(res)) }

解析

解析到結構體

//成員變量名首字母必須大寫 type IT struct {Company string `json:"company"` //改名字Subjects []string `json:"sub"`IsOk bool `json:",string"` //轉成字符串Price float64 `json:"-"` //這個不會輸出 }func main() {jsonBuf := `{"company":"abc","sub":["go","cpp","test"],"IsOk":"true"}`var tmp IT//參數一要切片[]byte,第二個參數要地址傳遞res := json.Unmarshal([]byte(jsonBuf), &tmp)if res != nil {fmt.Println(res)return}fmt.Println(tmp)//詳細打印fmt.Printf("%+v\n", tmp) }

解析到map

func main() {jsonBuf := `{"company":"abc","sub":["go","cpp","test"],"IsOk":"true"}`m := make(map[string]interface{}, 4)//參數一要切片[]byte,第二個參數要地址傳遞res := json.Unmarshal([]byte(jsonBuf), &m)if res != nil {fmt.Println(res)return}//詳細打印fmt.Printf("%+v\n", m) }

類型斷言
因為字符串不能直接接收

func main() {jsonBuf := `{"company":"abc","sub":["go","cpp","test"],"IsOk":"true"}`m := make(map[string]interface{}, 4)//參數一要切片[]byte,第二個參數要地址傳遞res := json.Unmarshal([]byte(jsonBuf), &m)if res != nil {fmt.Println(res)return}//str := string(m["company"])// 錯誤不能轉換//fmt.Println(str)/**IsOk ===> truecompany ===> abcsub ===> [go cpp test]*/for key, value := range m {fmt.Printf("%v ===> %v\n", key, value)switch data := value.(type) {case []interface{}://map[sub] 值是string, value是: [go cpp test]fmt.Printf("map[%s] 值是string, value是: %s\n", key, data)}} }

和 stream 中 JSON 打交道

上面所有的 JSON 數據來源都是預先定義的[]byte緩存,在很多時候,如果能讀取/寫入其他地方的數據就好了。encoding/json庫中有兩個專門處理這個事情的結構:Decoder和Encoder:

// Decoder 從 r io.Reader 中讀取數據,`Decode(v interface{})` 方法把數據轉換成對應的數據結構 func NewDecoder(r io.Reader) *Decoder// Encoder 的 `Encode(v interface{})` 把數據結構轉換成對應的 JSON 數據,然后寫入到 w io.Writer 中 func NewEncoder(w io.Writer) *Encoder

下面的例子就是從標準輸入流中讀取數據,解析成數據結構,刪除所有鍵不是Name的字段,然后再 encode 成 JSON 數據,打印到標準輸出。

package mainimport ("encoding/json""log""os" )func main() {dec := json.NewDecoder(os.Stdin)enc := json.NewEncoder(os.Stdout)for {var v map[string]interface{}if err := dec.Decode(&v); err != nil {log.Println(err)return}for k := range v {if k != "Name" {delete(v, k)}}if err := enc.Encode(&v); err != nil {log.Println(err)}} }

反序列化的[]和nil

package mainimport ("encoding/json""log" )type JS struct {A []string }func main() {v1 := &JS{}v2 := &JS{A: []string{}}o1, err := json.Marshal(&v1)log.Println(string(o1), err)o2, err2 := json.Marshal(&v2)log.Println(string(o2), err2) }

輸出

2019/01/07 18:13:26 {"A":null} <nil> 2019/01/07 18:13:26 {"A":[]} <nil>

總結

以上是生活随笔為你收集整理的golang中的json的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕二 | 曰曰操 | 国产超碰人人爽人人做人人爱 | 午夜时刻免费入口 | 手机在线永久免费观看av片 | 色玖玖| 日批网址 | 激情综合啪啪 | 国产成人区 | 亚洲色成人网站www永久四虎 | 国产成人精品国内自产拍免费看 | 日韩在线视频一区二区三区 | 香蕉视频黄色片 | a级黄色网 | 中文区中文字幕免费看 | 91成年版 | 亚洲奶水xxxx哺乳期 | 国产sss| 午夜男人天堂 | 久久作爱视频 | 成人精品影院 | 日韩天堂在线 | 天堂av免费看 | av一区二区三区在线 | 天天碰天天干 | a视频免费看 | 欧美专区第二页 | 久久久久久国产精品三级玉女聊斋 | 国产九九热视频 | xxxx999| 婷婷久久久久 | 日本韩国中文字幕 | 欧美性猛交ⅹxx乱大交 | 国产精品无码免费专区午夜 | 欧美午夜精品一区二区 | 精品三区视频 | 一区二区在线视频观看 | 天天干视频 | 高潮疯狂过瘾粗话对白 | h片在线免费看 | 成人在线影视 | 欧美视频日韩 | 日本一区免费视频 | xxxxwww国产 | 日韩精品久久久久久久酒店 | 亚洲欧洲日本在线 | 久久伊人五月天 | 成人中文字幕在线 | 免费久久 | 免费看国产一级片 | 99精品在线视频观看 | 免费欧美黄色片 | 超碰在线网| 亚洲色图视频在线 | 中文字幕人妻一区二区三区 | 中文字幕久热 | 国产一区二区免费在线观看 | 吸咬奶头狂揉60分钟视频 | 成人免费在线观看 | 女人张开双腿让男人捅 | 视频二区在线 | 四虎在线免费播放 | 蜜桃久久久| 黄色一级视频网站 | 在线成人免费 | 免费av网页| 日韩欧美福利视频 | 麻豆国产在线视频 | 操色网 | 久久久久久少妇 | 精品久久人人妻人人做人人 | 欧美日韩一区二区三区不卡 | 污污网站免费 | 蜜臀av性久久久久蜜臀av麻豆 | 小萝莉末成年一区二区 | 一级黄色片在线 | 国产一区二区啪啪啪 | 黑人黄色大片 | jizz中文字幕 | 国产精选一区二区三区 | 国产微拍精品 | 韩国中文字幕在线观看 | 狠色综合| 中文字幕av高清 | 欧美成人午夜视频 | 欧美日韩精品一区二区三区 | 美女视频免费在线观看 | 日韩一级二级 | 色综合天天综合网天天看片 | 免费毛片看片 | 黄色av免费观看 | 精品国产视频一区二区三区 | 久久无码人妻丰满熟妇区毛片 | 加勒比伊人| 亚洲日日日 | 很污的网站 | 欧美日韩成人在线观看 | 一级在线播放 | 日韩精品三区 |