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

在Go語言中使用JSON的方法

 更新時(shí)間:2018年02月10日 14:09:46   作者:tiaotiaoyly  
這篇文章主要介紹了在Go語言中使用JSON的相關(guān)資料,需要的朋友可以參考下

Encode

將一個(gè)對象編碼成JSON數(shù)據(jù),接受一個(gè)interface{}對象,返回[]byte和error:

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

Marshal函數(shù)將會遞歸遍歷整個(gè)對象,依次按成員類型對這個(gè)對象進(jìn)行編碼,類型轉(zhuǎn)換規(guī)則如下:

bool類型 轉(zhuǎn)換為JSON的Boolean
整數(shù),浮點(diǎn)數(shù)等數(shù)值類型 轉(zhuǎn)換為JSON的Number
string 轉(zhuǎn)換為JSON的字符串(帶""引號)
struct 轉(zhuǎn)換為JSON的Object,再根據(jù)各個(gè)成員的類型遞歸打包
數(shù)組或切片 轉(zhuǎn)換為JSON的Array
[]byte 會先進(jìn)行base64編碼然后轉(zhuǎn)換為JSON字符串
map 轉(zhuǎn)換為JSON的Object,key必須是string
interface{} 按照內(nèi)部的實(shí)際類型進(jìn)行轉(zhuǎn)換
nil 轉(zhuǎn)為JSON的null
channel,func等類型 會返回UnsupportedTypeError

type ColorGroup struct { 
 ID  int 
 Name string 
 Colors []string 
} 
group := ColorGroup{ 
 ID:  1, 
 Name: "Reds", 
 Colors: []string{"Crimson", "Red", "Ruby", "Maroon"}, 
} 
b, err := json.Marshal(group) 
if err != nil { 
 fmt.Println("error:", err) 
} 
os.Stdout.Write(b) 
Output: 
{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]} 

Decode

將JSON數(shù)據(jù)解碼

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

類型轉(zhuǎn)換規(guī)則和上面的規(guī)則類似

var jsonBlob = []byte(`[ 
 {"Name": "Platypus", "Order": "Monotremata"}, 
 {"Name": "Quoll", "Order": "Dasyuromorphia"} 
]`) 
type Animal struct { 
 Name string 
 Order string 
} 
var animals []Animal 
err := json.Unmarshal(jsonBlob, &animals) 
if err != nil { 
 fmt.Println("error:", err) 
} 
fmt.Printf("%+v", animals) 
Output: 
[{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]

結(jié)構(gòu)體

結(jié)構(gòu)體必須是大寫字母開頭的成員才會被JSON處理到,小寫字母開頭的成員不會有影響。

Mashal時(shí),結(jié)構(gòu)體的成員變量名將會直接作為JSON Object的key打包成JSON;Unmashal時(shí),會自動匹配對應(yīng)的變量名進(jìn)行賦值,大小寫不敏感。

Unmarshal時(shí),如果JSON中有多余的字段,會被直接拋棄掉;如果JSON缺少某個(gè)字段,則直接忽略不對結(jié)構(gòu)體中變量賦值,不會報(bào)錯(cuò)。

type Message struct { 
 Name string 
 Body string 
 Time int64 
 inner string 
} 
var m = Message{ 
 Name: "Alice", 
 Body: "Hello", 
 Time: 1294706395881547000, 
 inner: "ok", 
} 
b := []byte(`{"nAmE":"Bob","Food":"Pickle", "inner":"changed"}`) 
err := json.Unmarshal(b, &m) 
if err != nil { 
 fmt.Printf(err.Error()) 
 return 
} 
fmt.Printf("%v", m) 
Output: 
{Bob Hello 1294706395881547000 ok} 

 StructTag

如果希望手動配置結(jié)構(gòu)體的成員和JSON字段的對應(yīng)關(guān)系,可以在定義結(jié)構(gòu)體的時(shí)候給成員打標(biāo)簽:

使用omitempty熟悉,如果該字段為nil或0值(數(shù)字0,字符串"",空數(shù)組[]等),則打包的JSON結(jié)果不會有這個(gè)字段。

type Message struct { 
 Name string `json:"msg_name"`  // 對應(yīng)JSON的msg_name 
 Body string `json:"body,omitempty"` // 如果為空置則忽略字段 
 Time int64 `json:"-"`    // 直接忽略字段 
} 
var m = Message{ 
 Name: "Alice", 
 Body: "", 
 Time: 1294706395881547000, 
} 
data, err := json.Marshal(m) 
if err != nil { 
 fmt.Printf(err.Error()) 
 return 
} 
fmt.Println(string(data)) 
Output: 
{"msg_name":"Alice"} 

更靈活地使用JSON

使用json.RawMessage

json.RawMessage其實(shí)就是[]byte類型的重定義??梢赃M(jìn)行強(qiáng)制類型轉(zhuǎn)換。

現(xiàn)在有這么一種場景,結(jié)構(gòu)體中的其中一個(gè)字段的格式是未知的:

type Command struct { 
 ID int 
 Cmd string 
 Args *json.RawMessage 
}

使用json.RawMessage的話,Args字段在Unmarshal時(shí)不會被解析,直接將字節(jié)數(shù)據(jù)賦值給Args。我們可以能先解包第一層的JSON數(shù)據(jù),然后根據(jù)Cmd的值,再確定Args的具體類型進(jìn)行第二次Unmarshal。

這里要注意的是,一定要使用指針類型*json.RawMessage,否則在Args會被認(rèn)為是[]byte類型,在打包時(shí)會被打包成base64編碼的字符串。

使用interface{}

interface{}類型在Unmarshal時(shí),會自動將JSON轉(zhuǎn)換為對應(yīng)的數(shù)據(jù)類型:

JSON的boolean 轉(zhuǎn)換為bool
JSON的數(shù)值 轉(zhuǎn)換為float64
JSON的字符串 轉(zhuǎn)換為string
JSON的Array 轉(zhuǎn)換為[]interface{}
JSON的Object 轉(zhuǎn)換為map[string]interface{}

JSON的null 轉(zhuǎn)換為nil

需要注意的有兩個(gè)。一個(gè)是所有的JSON數(shù)值自動轉(zhuǎn)換為float64類型,使用時(shí)需要再手動轉(zhuǎn)換為需要的int,int64等類型。第二個(gè)是JSON的object自動轉(zhuǎn)換為map[string]interface{}類型,訪問時(shí)直接用JSON Object的字段名作為key進(jìn)行訪問。再不知道JSON數(shù)據(jù)的格式時(shí),可以使用interface{}。

自定義類型

如果希望自己定義對象的打包解包方式,可以實(shí)現(xiàn)以下的接口:

type Marshaler interface { 
 MarshalJSON() ([]byte, error) 
} 
type Unmarshaler interface { 
 UnmarshalJSON([]byte) error 
} 

實(shí)現(xiàn)該接口的對象需要將自己的數(shù)據(jù)打包和解包。如果實(shí)現(xiàn)了該接口,json在打包解包時(shí)則會調(diào)用自定義的方法,不再對該對象進(jìn)行其他處理。

總結(jié)

以上所述是小編給大家介紹的在Go語言中使用JSON的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 詳解Go語言中iota的應(yīng)用

    詳解Go語言中iota的應(yīng)用

    在本文中,小編將帶著大家深入探討?iota?的神奇力量,包括?iota?的介紹和應(yīng)用場景以及使用技巧和注意事項(xiàng),準(zhǔn)備好了嗎,準(zhǔn)備一杯你最喜歡的飲料或茶,隨著本文一探究竟吧
    2023-07-07
  • Golang中生成隨機(jī)字符串并復(fù)制到粘貼板的方法

    Golang中生成隨機(jī)字符串并復(fù)制到粘貼板的方法

    這篇文章主要介紹了Golang中生成隨機(jī)字符串并復(fù)制到粘貼板的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 通過client-go來操作K8S集群的操作方法

    通過client-go來操作K8S集群的操作方法

    本文詳細(xì)介紹了client-go的安裝、配置和使用方法,并通過示例代碼展示了如何進(jìn)行常見的Kubernetes操作,希望這些內(nèi)容能幫助大家更好地理解和使用client-go,從而提高你的Kubernetes開發(fā)效率,感興趣的朋友一起看看吧
    2024-11-11
  • 簡單高效!Go語言封裝二級認(rèn)證功能實(shí)現(xiàn)

    簡單高效!Go語言封裝二級認(rèn)證功能實(shí)現(xiàn)

    本文將介紹如何使用Go語言封裝二級認(rèn)證功能,實(shí)現(xiàn)簡單高效的用戶認(rèn)證流程,二級認(rèn)證是一種安全措施,要求用戶在登錄后進(jìn)行額外的身份驗(yàn)證,以提高賬戶安全性,
    2023-10-10
  • 使用Go module和GoLand初始化一個(gè)Go項(xiàng)目的方法

    使用Go module和GoLand初始化一個(gè)Go項(xiàng)目的方法

    這篇文章主要介紹了使用Go module和GoLand初始化一個(gè)Go項(xiàng)目,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 淺析go中Ticker,Timer和Tick的用法與區(qū)別

    淺析go中Ticker,Timer和Tick的用法與區(qū)別

    在go面試的時(shí)候,面試官經(jīng)常會問time包的Ticker,Timer以及Tick的區(qū)別,一般在超時(shí)控制的時(shí)候用的比較多,今天就跟隨小編一起來詳細(xì)學(xué)一下這幾個(gè)的區(qū)別吧
    2023-10-10
  • 使用Go和Tesseract實(shí)現(xiàn)驗(yàn)證碼識別的流程步驟

    使用Go和Tesseract實(shí)現(xiàn)驗(yàn)證碼識別的流程步驟

    驗(yàn)證碼主要用于區(qū)分人類用戶和機(jī)器程序,Tesseract 是一個(gè)開源的光學(xué)字符識別(OCR)引擎,支持多種語言和字體,并具有較高的識別準(zhǔn)確率,它由 Google 維護(hù),并且可以通過多種編程語言調(diào)用,本文給大家介紹了使用Go和Tesseract實(shí)現(xiàn)驗(yàn)證碼識別的流程步驟
    2025-01-01
  • Go開發(fā)神器Air熱加載的安裝使用探究

    Go開發(fā)神器Air熱加載的安裝使用探究

    這篇文章主要介紹了Go開發(fā)神器Air熱加載使用實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Goland IDEA項(xiàng)目多開設(shè)置方式

    Goland IDEA項(xiàng)目多開設(shè)置方式

    這篇文章主要介紹了Goland IDEA項(xiàng)目多開設(shè)置方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • GO語言實(shí)現(xiàn)列出目錄和遍歷目錄的方法

    GO語言實(shí)現(xiàn)列出目錄和遍歷目錄的方法

    這篇文章主要介紹了GO語言實(shí)現(xiàn)列出目錄和遍歷目錄的方法,涉及ioutil.ReadDir()與filepath.Walk()的應(yīng)用,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12

最新評論

大安市| 濮阳县| 区。| 宁武县| 沙坪坝区| 漳平市| 白银市| 罗江县| 垣曲县| 盘山县| 外汇| 刚察县| 宁晋县| 西平县| 舒城县| 漠河县| 舞阳县| 淄博市| 滨州市| 保定市| 大丰市| 高淳县| 和顺县| 江安县| 南昌市| 满洲里市| 金昌市| 文昌市| 基隆市| 洞头县| 会东县| 永清县| 鹿邑县| 牟定县| 肇源县| 英德市| 鄂尔多斯市| 勃利县| 宁陕县| 车致| 平邑县|