go的json序列化

2021-10-08 02:41:38 字數 3644 閱讀 4390

go語言的json序列化與反序列化借助的go語言的資料結構是 結構體(python中借助的是字典)

宣告乙個movie結構體

type movie struct

1、json.marshal
// 先例項化乙個結構體

var movies =

movie},

},},

}// struct -> json string 將結構體序列化為json 字串

data, err := json.

marshal

(movies)

if err !=

nil fmt.

printf

("%s\n"

, data)

// out

/*[,,]

*/

marshal 序列化後返回乙個編碼後的位元組切片uint8,包含很長的字串,沒有空白縮排,這種緊湊的表現形式不便與閱讀,所以使用marshalindent

2、json.marshalindent

data, err := json.

marshalindent

(movies,"",

" "

)if err !=

nilfmt.

printf

("%s\n"

, data)

// marshalindent(),需要三個引數,後兩個額外的字串引數 用於表示每一行輸出的字首和每乙個層級的縮排,

輸出:
[,,

]

可能留意到了,json序列化編碼後,原來的year 和 color 字段發生了變化,變成了released和color, 這是因為結構體成員 tag導致的

tag資訊

year   int

`json:"released"`

color bool

`json:"color,omitempty"`

反引號裡的tag可以是任意的字串面值,通常是一系列用空格分割的key:「value」鍵值對序列,因為值種含有雙引號字元,因此tag一般使用原生字串面值的形式書寫。json開頭鍵名對應的值用於控制encoding/json包的編碼和解碼的行為,並且encoding/…下面其它的包也遵循這個約定。成員tag中json對應值的第一部分用於指定json物件的名字,序列化的結果就是結構體的欄位名變為了json物件的名字,如go結構體的year欄位對應到json中的released物件,color成員的tag還帶了乙個額外的omitempty選項,表示當go語言結構體成員為空或零值時不生成json物件,電影casablanca是乙個黑白電影,並沒有輸出color成員。

m1 := movie

json_str :=

`` err = json.

unmarshal([

]byte

(json_str)

,&m1)

// 只反序列化部分字段,選擇性的解碼json物件中的成員

var released [

]struct

// 自返回發行時間

var actor [

]struct

//只返回主演演員

var titles [

]struct

// 返回電影title

var color [

]struct

// 返回電影顏色

err = json.

unmarshal

(data,

&titles)

err = json.

unmarshal

(data,

&released)

err = json.

unmarshal

(data,

&actor)

if err !=

nilfmt.

println

(released)

fmt.

println

(actor)

fmt.

println

(m1)

編碼的逆操作是解碼,對應將json資料解碼為go語言的資料結構,go語言的反序列化通過json.unmarshal()函式完成。注意,在反序列tag中的json物件的時候,欄位的名字必須是json的物件欄位並要將json物件欄位的首字母大寫,才能反序列化成功

//巢狀結構體序列化

type user struct

type profile struct

func

nestedstructdemo()

,//profile:profile,

} b, err := json.

marshalindent

(u1,"",

" ")

if err !=

nil fmt.

printf

("str:%s\n"

, b)

}// 序列化結果

/*str:

*/

1、變為雙層巢狀的json串
type user struct

// str:}

2、忽略空值字段
type user struct

// 給巢狀的結構體欄位tag增加 omiteempty 字段

type profile struct

// 序列化輸出結果

/*str:

*/// 或者

type user struct

type profile struct

// str:

3、不修改原結構體忽略空值字段
type usr struct

type publicuser struct

`json:"password,omitempty"`

}func

omitpassworddemo()

p := publicuser

u,_:= json.

marshal

(p) fmt.

printf

("str:%s\n"

,u)}

// 本質就是借助匿名巢狀,並新增了omitempty,當空值時不序列化

關於字段可見性:序列化和反序列化本質上是兩個包的資料之間的轉化,乙個是自己寫的包,就是自己寫的**所在的包,另乙個就是json包

而go語言的乙個包之間的關鍵特性就是 型別變數首字母大寫才能對外可見,所以在涉及序列化和反序列化時,必須將字段首字母大寫

關於前後端互動:如果必須得用全小寫,那麼就使用 go語言的tag標籤功能,tag的格式需嚴格執行:即 反引號``,將鍵值對擴起來,裡面的值要用雙引號擴起來,

如果是多個tag,之間用《空格》隔開。

反序列化的格式:json.unmarshal(byte(jsonstr),&c2),括號裡的是byte型別的陣列,和結構體的指標。

反序列化時,對於go結構體中有tag對應的json物件的,存放反序列化的結構體中的字段必須為json物件的字段,並且首字母大寫,不然無法實現反序列化。

go複雜json反序列化與序列化

這裡說的複雜json,就是內嵌了陣列的json,如下例所示 var str string str message success 我們需要把這段json資料反序列化成struct型別,需要先定義以下兩個結構體 type cjsonelem struct type cjson struct注意 str...

json序列化 反序列化

json序列化 json的dumps方法可以將json格式資料序列為python的相關資料型別,比如str,常用於列印,另外,在序列化時,中文漢字被轉換為unicode編碼,在dumps函式中新增引數ensure ascii false可解決 dumps的indent參考可以調整顯示格式,即縮排,一...

JSON的序列化和反序列化

今天看了好多關於解析json的例子,但是都不全,而且還要自己找dll,於是自己寫了乙個全的json解析類,供以後參考 下面給出乙個要解析的字串 str str 1 解析json的工具類如下 1 在專案中新增引用 newtonsoft.json.dll,見附件 using system using s...