首頁 >後端開發 >Golang >詳解Json序列化在golang的應用

詳解Json序列化在golang的應用

藏色散人
藏色散人轉載
2021-03-25 17:15:442648瀏覽

關於我

詳解Json序列化在golang的應用golang對json序列化和反序列化的操作實在是難受,所以說用習慣了高級語言特性,再轉到這些偏原生的寫法上就會很難受。

不多BB,開始錄音。

序列化函式庫的選擇

當寫個小demo或做個小工具,沒有大規模使用場景,那使用哪個函式庫都是一樣的,因為性能的體現並不會很明顯。但如果是在實際專案中使用,且伴隨著高並發,大容量等場景,我還是推薦使用

json-iterator

go自帶json函式庫<pre class="brush:php;toolbar:false">&quot;encoding/json&quot; 官当自带</pre>

#json-iterator號稱最快的go json解析器。跟官方的寫法相容,我目前基本上都使用這個。

github.com/json-iterator/go

效率比較

ns 奈秒 op 運算

#ns/opallocation bytes35510 ns/op1960 B/op160 B/op160 B/op712 B/op#576 B/op##384 B/op#4 allocs/op
type Hero struct {
    Name string
    Age int
    Birthday string
    Sal float64
    Skill string}

allocation times
std decode
99 allocs/op easyjson decode 8499 ns/op
4 allocs/op jsoniter decode #5623 ns/ op
3 allocs/op #std encode 2213 ns/op
5 allocs/op easyjson encode 883 ns/op
3 allocs/op jsoniter encode 837 ns/op
編碼案例
序列化

hero := Hero{
    Name:     "小王",
    Age:      20,
    Birthday: "2021-02-23",
    Sal:      88.02,
    Skill:    "技能",}jsonStu, err := json.Marshalif err != nil {
    fmt.Println("生成json字}fmt.Println(string(jsonStu))

反序列化

結構struct

str := "{\"Name\":\"张三丰\",\"Age\":98,\"Birthday\":\"2001-09-21\",\"Sal\":3800.85,\"Skill\":\"武当剑法\"}"
var hero Hero
err := json.Unmarshal([]byte(str), &hero)
if err != nil {
fmt.Printf("unmarshal err=%v\n", err)
}
結構體陣列

#兩個方式,一種直接反序列化成結構體數組,另一種反序列化為slice,內容為map[string]interface{}

結構體數組
str := `[{"Name":"张三丰","Age":98,"Birthday":"2001-09-21","Sal":3800.85,"Skill":"武当剑法"},{"Name":"张无忌","Age":28,"Birthday":"2004-09-21","Sal":300.85,"Skill":"乾坤大挪移"}]`

var hero []Hero
err := json.Unmarshal([]byte(str), &hero)
if err != nil {
fmt.Printf("unmarshal err=%v\n", err)
}
fmt.Printf("反序列化后 hero=%v", hero)

slice

str := `[{"Name":"张三丰","Age":98,"Birthday":"2001-09-21","Sal":3800.85,"Skill":"武当剑法"},{"Name":"张无忌","Age":28,"Birthday":"2004-09-21","Sal":300.85,"Skill":"乾坤大挪移"}]`

//定义一个slice
var slice []map[string]interface{}
//注意:反序列化map,不需要make,因为make操作被封装到Unmarshal函数
err := json.Unmarshal([]byte(str), &slice)
if err != nil {
fmt.Printf("unmarshal err=%v\n", err)
}
fmt.Printf("反序列化后 slice=%v\n", slice)

以上是詳解Json序列化在golang的應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除