golang對json序列化和反序列化的操作實在是難受,所以說用習慣了高級語言特性,再轉到這些偏原生的寫法上就會很難受。
序列化函式庫的選擇
當寫個小demo或做個小工具,沒有大規模使用場景,那使用哪個函式庫都是一樣的,因為性能的體現並不會很明顯。但如果是在實際專案中使用,且伴隨著高並發,大容量等場景,我還是推薦使用
json-iteratorgo自帶json函式庫<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">"encoding/json" 官当自带</pre><div class="contentsignin">登入後複製</div></div>
ns 奈秒 op 運算
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 | ##384 B/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))
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) }
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)
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中文網其他相關文章!