將乙個物件編碼成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...