亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang 如何解析和生成json

 更新時(shí)間:2020年09月04日 15:32:08   作者:Dabelv  
這篇文章主要介紹了Golang 如何解析和生成json,幫助大家更好的理解和學(xué)習(xí)golang,感興趣的朋友可以了解下

JSON(Javascript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換語(yǔ)言,以文字為基礎(chǔ),具有自我描述性且易于讓人閱讀。盡管JSON是JavaScript的一個(gè)子集,但JSON是獨(dú)立于語(yǔ)言的文本格式,并且采用了類(lèi)似于C語(yǔ)言家族的一些習(xí)慣。JSON與XML最大的不同在于XML是一個(gè)完整的標(biāo)記語(yǔ)言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及瀏覽器的內(nèi)建快速解析支持,使得其更適用于網(wǎng)絡(luò)數(shù)據(jù)傳輸領(lǐng)域。

Golang自帶的JSON解析庫(kù)encoding/json,可以用起將結(jié)構(gòu)化數(shù)據(jù)序列化成json字符串或從json字符串中解析出我們想要的數(shù)據(jù)。

1.解析json

給一個(gè)較為復(fù)雜的json字符串,包含數(shù)組,數(shù)組的元素是json對(duì)象。我們需要取出數(shù)組第一個(gè)元素中的某一個(gè)字段值。其它的解析均可參考下面的代碼。

package main

import (
  "encoding/json"
  "fmt"
)

func main() {
    jsonStr := []byte(`{"uin":1589276509,"feedID":10000,"videos":[{"picture":"http://qqpublic.qpic.cn/avatar.jpg","duration":"839"}]}`)
    var jsonMap map[string]interface{}
    if err := json.Unmarshal(jsonStr, &jsonMap); err!=nil {
      fmt.Printf("json decode failed, err=%v", err)
      return
    }
    value, ok:=jsonMap["videos"]
    fmt.Printf("value=%#v\n", value)
    if ok {
        sliceValue, ok := value.([]interface{})
        if ok {
            mapValue, ok := sliceValue[0].(map[string]interface{})
            if ok {
                duration, ok := mapValue["duration"]
                if ok {
                    fmt.Printf("d=%v,type=%T\n",duration,duration)
                }
            }
        }
    }
}

程序輸出:

value=[]interface {}{map[string]interface {}{"picture":"http://qqpublic.qpic.cn/avatar.jpg", "duration":"839"}}
d=839,type=string

解析json字符串時(shí),需要注意如下幾點(diǎn):
(1)Go類(lèi)型和JSON類(lèi)型的對(duì)應(yīng)關(guān)系如下:

map[string]interface{}代表JSON對(duì)象
[]interface{}代表JSON數(shù)組
bool代表JSON booleans
float64代表JSON numbers
string代表JSON strings
nil 代表JSON null

2.生成json

假設(shè)我們有如下一個(gè)類(lèi)(結(jié)構(gòu)體)student 及其一個(gè)實(shí)例對(duì)象st,將其序列化為json,具體實(shí)現(xiàn)如下:

package main

import (
  "encoding/json"
  "fmt"
)

type Stu struct {
  Name string `json:"name"`
  Age  int
  sex  string
  Class *Class `json:"class"`
}

type Class struct {
  Name string
  Grade int
}

func main() {
//實(shí)例化一個(gè)數(shù)據(jù)結(jié)構(gòu),用于生成json字符串
  stu := Stu{
    Name: "張三",
    Age: 18,
    sex: "男",
  }

  //指針變量
  cla := new(Class)
  cla.Name = "1班"
  cla.Grade = 3
  stu.Class=cla

  //Marshal失敗時(shí)err!=nil
  jsonStu, err := json.Marshal(stu)
  if err != nil {
    fmt.Println("生成json字符串錯(cuò)誤")
  }

  //jsonStu是[]byte類(lèi)型,轉(zhuǎn)化成string類(lèi)型便于查看
  fmt.Println(string(jsonStu))
}

程序輸出結(jié)果:

{"name":"張三","Age":18,"class":{"Name":"1班","Grade":3}}

閱讀以上代碼可以看出:

(1)只要是可導(dǎo)出成員(變量首字母大寫(xiě)),都可以轉(zhuǎn)成json。因成員變量sex是不可導(dǎo)出的,故無(wú)法轉(zhuǎn)成json;

(2)如果變量打上了json標(biāo)簽,如Name旁邊的 json:"name" ,那么轉(zhuǎn)化成的json key就用該標(biāo)簽“name”,否則取字段名作為key,如"Age";

(3)指針變量,編碼時(shí)自動(dòng)轉(zhuǎn)換為它所指向的值,如Class變量;

(4)強(qiáng)調(diào)一句,序列化成功后的json字符串是純粹的字符串。

以上就是Golang 如何解析和生成json的詳細(xì)內(nèi)容,更多關(guān)于golang 解析、生成json的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang連接池的幾種實(shí)現(xiàn)案例小結(jié)

    Golang連接池的幾種實(shí)現(xiàn)案例小結(jié)

    這篇文章主要介紹了Golang連接池的幾種實(shí)現(xiàn)案例小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • golang微服務(wù)框架kratos實(shí)現(xiàn)Socket.IO服務(wù)的方法

    golang微服務(wù)框架kratos實(shí)現(xiàn)Socket.IO服務(wù)的方法

    本文主要介紹了golang微服務(wù)框架kratos實(shí)現(xiàn)Socket.IO服務(wù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • go mod tidy加載模塊超時(shí)的問(wèn)題及解決

    go mod tidy加載模塊超時(shí)的問(wèn)題及解決

    go mod tidy加載模塊超時(shí)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Go操作各大消息隊(duì)列教程(RabbitMQ、Kafka)

    Go操作各大消息隊(duì)列教程(RabbitMQ、Kafka)

    消息隊(duì)列是一種異步的服務(wù)間通信方式,適用于無(wú)服務(wù)器和微服務(wù)架構(gòu),本文主要介紹了Go操作各大消息隊(duì)列教程(RabbitMQ、Kafka),需要的朋友可以了解一下
    2024-02-02
  • 使用Go實(shí)現(xiàn)優(yōu)雅重啟服務(wù)功能

    使用Go實(shí)現(xiàn)優(yōu)雅重啟服務(wù)功能

    這篇文章主要介紹了如何使用Go來(lái)實(shí)現(xiàn)優(yōu)雅重啟服務(wù),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • go語(yǔ)言使用Casbin實(shí)現(xiàn)角色的權(quán)限控制

    go語(yǔ)言使用Casbin實(shí)現(xiàn)角色的權(quán)限控制

    Casbin是用于Golang項(xiàng)目的功能強(qiáng)大且高效的開(kāi)源訪(fǎng)問(wèn)控制庫(kù)。本文主要介紹了go語(yǔ)言使用Casbin實(shí)現(xiàn)角色的權(quán)限控制,感興趣的可以了解下
    2021-06-06
  • 詳解Go語(yǔ)言中net/http包的使用

    詳解Go語(yǔ)言中net/http包的使用

    Go語(yǔ)言?xún)?nèi)置的?net/http?包十分的優(yōu)秀,提供了HTTP客戶(hù)端和服務(wù)端的實(shí)現(xiàn),本文主要就來(lái)和大家聊聊net/http包的使用,感興趣的可以了解一下
    2023-07-07
  • go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實(shí)現(xiàn)示例

    go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go語(yǔ)言錯(cuò)誤處理異常捕獲+異常拋出

    Go語(yǔ)言錯(cuò)誤處理異常捕獲+異常拋出

    這篇文章主要介紹了Go語(yǔ)言錯(cuò)誤處理異常捕獲和異常拋出,Go語(yǔ)言的作者認(rèn)為java等語(yǔ)言的錯(cuò)誤處理底層實(shí)現(xiàn)較為復(fù)雜,就實(shí)現(xiàn)了函數(shù)可以返回錯(cuò)誤類(lèi)型以及簡(jiǎn)單的異常捕獲,雖然簡(jiǎn)單但是也非常精妙,大大的提高了運(yùn)行效率,下文需要的朋友可以參考一下
    2022-02-02
  • Go時(shí)間操作常用方法(推薦!)

    Go時(shí)間操作常用方法(推薦!)

    平時(shí)開(kāi)發(fā)過(guò)程中,時(shí)間相關(guān)的操作用的還是很多的,下面這篇文章主要給大家介紹了關(guān)于Go時(shí)間操作常用方法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06

最新評(píng)論