最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語(yǔ)言中json處理方式詳解

 更新時(shí)間:2024年05月24日 08:26:56   作者:uccs  
這篇文章主要介紹了go語(yǔ)言中json處理方式,文中通過(guò)實(shí)例代碼講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴跟著小編一起來(lái)看看吧

json 序列化

go 語(yǔ)言中序列化 json 數(shù)據(jù)使用 json.Marshal 方法,代碼如下:

func main() {
  mm := map[string]interface{}{
    "name": "uccs",
    "age":  12,
    "extra": map[string]interface{}{
      "phone": "12345678910",
    },
  }
  bytes, _ := json.Marshal(mm)
  fmt.Println(string(bytes))
}

如果說(shuō)需要對(duì) json 數(shù)據(jù)進(jìn)行格式化輸出,可以使用 json.MarshalIndent 方法,代碼如下:

  • MarshalIndent 第一個(gè)參數(shù)是要序列化的數(shù)據(jù),第二個(gè)參數(shù)是前綴,第三個(gè)參數(shù)是縮進(jìn)字符
json.MarshalIndent(mm, "", "  ")

序列化結(jié)構(gòu)體

序列化結(jié)構(gòu)體的時(shí)候,需要注意以下 2 點(diǎn):

  • 結(jié)構(gòu)體的字段必須是大寫字母開頭,否則無(wú)法序列化
  • 可以使用 json tag 來(lái)指定序列化后的字段名

json tag 使用方式:

  • json:"name" 表示序列化后的字段名為 name
  • json:"Phone,omitempty" 表示序列化后的字段名為 phone,如果字段值為空,則不序列化
  • 如果是指針形式的字段
    • 字段值為空,則不序列化,例如下面的 Name 字段,不會(huì)被序列化,因?yàn)橹羔槥?nil
    • 字段值是空字符串,則序列化,例如下面的 Email 字段,會(huì)被序列化,因?yàn)橹羔槻粸?nil
type Person struct {
  Name  *string `json:"name,omitempty"`
  Email *string `json:"email,omitempty"`
}
email := ""
p := Person{
  Email: &email,
}
  • json:"age,string" 序列化時(shí)可以將數(shù)字變成字符串
  • json:"-" 序列化時(shí)忽略該字段

反序列化

go 反序列化使用 json.Unmarshal 方法,傳入 json 字符串和結(jié)構(gòu)體指針,代碼如下:

func main() {
  j := `{
    "name": "uccs",
    "age": 18,
    "email": "",
    "phone": "2222"
  }`
  var p Person
  _ := json.Unmarshal([]byte(j), &p)
  fmt.Println(p)
}

反序列化的時(shí)候,需要注意,傳遞空字符串和沒有傳遞字段是沒有區(qū)別的,都會(huì)被反序列化,例如上面的 Email 字段,傳遞空字符串和沒有傳遞字段拿到的值都是一個(gè)空

如何區(qū)分傳遞空字符串和沒有傳遞字段呢?

需要在定義結(jié)構(gòu)體的時(shí)候使用指針類型,例如下面的 Email 字段,如果傳遞空字符串,則 Email 字段的值是一個(gè)地址,如果沒有傳遞字段,則 Email 字段的值是 nil

type Person struct {
  Name  string  `json:"name"`
  Age   int     `json:"age"`
  Email *string `json:"email"`
  Phone string  `json:"phone"`
}
j := `{
  "name": "uccs",
  "age": 18,
  "phone": "2222"
}`
k := `{
  "name": "uccs",
  "age": 18,
  "email": "",
  "phone": "2222"
}`
var p1 Person
var p2 Person
_ := json.Unmarshal([]byte(j), &p1)
_ := json.Unmarshal([]byte(k), &p2)
fmt.Println(p1)  // {uccs 18 <nil> 2222}
fmt.Println(p2)  // {uccs 18 0xc000014140 2222}

所以我們可以通過(guò)判斷 Email 字段是否為 nil 來(lái)區(qū)分傳遞空字符串和沒有傳遞字段

fmt.Println(p1.Email == nil)  // Email 是否為 nil 判斷是否傳遞了 Email 字段

encoder

encoder 是一個(gè) Writer 接口,可以用于寫入文件

相比于 file.WriteString(string(bytes)) 方式,encoder 可以直接將結(jié)構(gòu)體寫入文件,并且是以流的方式寫入

func main() {
  p := Person{
    Name: "xiaoming",
    Age:  543251,
  }
  file, _ := os.Create("person.json")
  defer file.Close()
  encoder := json.NewEncoder(file)
  encoder.SetEscapeHTML(true) // 轉(zhuǎn)義 json 中的特殊字符
  encoder.Encode(p)
}

decoder

decoder 是一個(gè) Reader 接口,可以用于讀取文件

decoder 是 encoder 的逆操作,可以從文件中讀取 json 數(shù)據(jù)并且反序列化

func main() {
  file, _ := os.Open("person.json")
  defer file.Close()
  decoder := json.NewDecoder(file)
  p := Person{}
  decoder.Decode(&p)
  fmt.Println(p)
}

到此這篇關(guān)于go語(yǔ)言中json處理方式詳解的文章就介紹到這了,更多相關(guān)go json處理方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用golang編寫一個(gè)并發(fā)工作隊(duì)列

    使用golang編寫一個(gè)并發(fā)工作隊(duì)列

    這篇文章主要介紹了使用golang編寫一個(gè)并發(fā)工作隊(duì)列的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑

    Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑

    今天小編就為大家分享一篇關(guān)于Go語(yǔ)言range關(guān)鍵字循環(huán)時(shí)的坑,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • go 壓縮解壓zip文件源碼示例

    go 壓縮解壓zip文件源碼示例

    這篇文章主要為大家介紹了go壓縮及解壓zip文件的源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • golang快速實(shí)現(xiàn)網(wǎng)頁(yè)截圖的方法

    golang快速實(shí)現(xiàn)網(wǎng)頁(yè)截圖的方法

    這篇文章主要介紹了golang快速實(shí)現(xiàn)網(wǎng)頁(yè)截圖的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • gin自定義中間件解決requestBody不可重讀(請(qǐng)求體取值)

    gin自定義中間件解決requestBody不可重讀(請(qǐng)求體取值)

    這篇文章主要介紹了gin自定義中間件解決requestBody不可重讀,確??刂破髂軌颢@取請(qǐng)求體值,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Go使用chan或context退出協(xié)程示例詳解

    Go使用chan或context退出協(xié)程示例詳解

    這篇文章主要為大家介紹了Go使用chan或context退出協(xié)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • go時(shí)間/時(shí)間戳操作大全(小結(jié))

    go時(shí)間/時(shí)間戳操作大全(小結(jié))

    這篇文章主要介紹了go時(shí)間/時(shí)間戳操作大全,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Gin框架中的GET和POST表單處理的實(shí)現(xiàn)

    Gin框架中的GET和POST表單處理的實(shí)現(xiàn)

    Gin框架提供了簡(jiǎn)單而強(qiáng)大的機(jī)制來(lái)處理GET和POST表單提交的數(shù)據(jù),通過(guò)c.Query、c.PostForm、c.Bind和c.Request.FormFile等方法,可以輕松地獲取和處理各種表單數(shù)據(jù),感興趣的可以了解一下
    2025-03-03
  • 淺析Go語(yǔ)言中的超時(shí)控制

    淺析Go語(yǔ)言中的超時(shí)控制

    日常開發(fā)中我們大概率會(huì)遇到超時(shí)控制的場(chǎng)景,而一個(gè)良好的超時(shí)控制可以有效的避免一些問(wèn)題,所以本文就來(lái)和大家深入探討一下Go語(yǔ)言中的超時(shí)控制吧
    2023-10-10
  • Go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲

    Go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10

最新評(píng)論

西丰县| 娄底市| 武胜县| 水城县| 祁东县| 扎兰屯市| 崇州市| 衡阳市| 淮北市| 阿拉善左旗| 翼城县| 遵化市| 临夏县| 章丘市| 都昌县| 宝兴县| 芜湖县| 介休市| 宁陕县| 定日县| 乐平市| 虎林市| 龙胜| 天门市| 萝北县| 都安| 武威市| 山西省| 大连市| 永胜县| 元阳县| 扎囊县| 陵水| 阿勒泰市| 义乌市| 洪泽县| 兴宁市| 赤城县| 辽中县| 桐庐县| 壤塘县|