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...