在Go語言中使用JSON

2021-06-25 07:29:18 字數 2788 閱讀 1397

將乙個物件編碼成json資料,接受乙個inte***ce{}物件,返回byte和error:

func marshal(v inte***ce{}) (byte, error)

marshal函式將會遞迴遍歷整個物件,依次按成員型別對這個物件進行編碼,型別轉換規則如下:

bool型別轉換為json的boolean

整數,浮點數等數值型別轉換為json的number

string轉換為json的字串(帶""引號)

struct轉換為json的object,再根據各個成員的型別遞迴打包

陣列或切片轉換為json的array

byte會先進行base64編碼然後轉換為json字串

map轉換為json的object,key必須是string

inte***ce{}按照內部的實際型別進行轉換

nil轉為json的null

channel,func等型別會返回unsupportedtypeerror

type colorgroup struct 

group := colorgroup,

}b, err := json.marshal(group)

if err != nil

os.stdout.write(b)

output:

將json資料解碼

func unmarshal(data byte, v inte***ce{}) error

型別轉換規則和上面的規則類似

var jsonblob = byte(`[

,]`)type animal struct

var animals animal

err := json.unmarshal(jsonblob, &animals)

if err != nil

fmt.printf("%+v", animals)

output:

[ ]

結構體必須是大寫字母開頭的成員才會被json處理到,小寫字母開頭的成員不會有影響。

mashal時,結構體的成員變數名將會直接作為json object的key打包成json;unmashal時,會自動匹配對應的變數名進行賦值,大小寫不敏感。

unmarshal時,如果json中有多餘的字段,會被直接拋棄掉;如果json缺少某個字段,則直接忽略不對結構體中變數賦值,不會報錯。

type message struct 

var m = message

b := byte(``)

err := json.unmarshal(b, &m)

if err != nil

fmt.printf("%v", m)

output:

如果希望手動配置結構體的成員和json欄位的對應關係,可以在定義結構體的時候給成員打標籤:

使用omitempty熟悉,如果該字段為nil或0值(數字0,字串"",空陣列等),則打包的json結果不會有這個字段。

type message struct 

var m = message

data, err := json.marshal(m)

if err != nil

fmt.println(string(data))

output:

json.rawmessage其實就是byte型別的重定義。可以進行強制型別轉換。

現在有這麼一種場景,結構體中的其中乙個欄位的格式是未知的:

type command struct

使用json.rawmessage的話,args欄位在unmarshal時不會被解析,直接將位元組資料賦值給args。我們可以能先解包第一層的json資料,然後根據cmd的值,再確定args的具體型別進行第二次unmarshal。

這裡要注意的是,一定要使用指標型別*json.rawmessage,否則在args會被認為是byte型別,在打包時會被打包成base64編碼的字串。

inte***ce{}型別在unmarshal時,會自動將json轉換為對應的資料型別:

json的boolean轉換為bool

json的數值轉換為float64

json的字串轉換為string

json的array轉換為inte***ce{}

json的object轉換為map[string]inte***ce{}

json的null轉換為nil

需要注意的有兩個。乙個是所有的json數值自動轉換為float64型別,使用時需要再手動轉換為需要的int,int64等型別。第二個是json的object自動轉換為map[string]inte***ce{}型別,訪問時直接用json object的欄位名作為key進行訪問。再不知道json資料的格式時,可以使用inte***ce{}。

如果希望自己定義物件的打包解包方式,可以實現以下的介面:

type marshaler inte***ce 

type unmarshaler inte***ce

實現該介面的物件需要將自己的資料打包和解包。如果實現了該介面,json在打包解包時則會呼叫自定義的方法,不再對該物件進行其他處理。

Go語言中使用JSON

encode 將乙個物件編碼成json資料,接受乙個inte ce 物件,返回byte和error func marshal v inte ce byte,error marshal函式將會遞迴遍歷整個物件,依次按成員型別對這個物件進行編碼,型別轉換規則如下 bool型別 轉換為json的boole...

在Go語言中使用JSON的方法

encode 將乙個物件編碼成json資料,接受乙個inte ce 物件,返回byte和error func marshal v inte ce byte,error marshal函式將會遞迴遍歷整個物件,依次按成員型別對這個物件進行編碼,型別轉換規則如下 bool型別 轉換為json的boole...

在PHP語言中使用JSON

目前,json已經成為最流行的資料交換格式之一,各大 的api幾乎都支援它。我寫過一篇 資料型別和json格式 它的設計思想。今天,我想總結一下php語言對它的支援,這是開發網際網路應用程式 特別是編寫api 必須了解的知識。從5.2版本開始,php原生提供json encode 和json dec...