go語言中的關於json編碼與解碼的注意點
今天記錄一下,go語言中關於json編碼與解碼的一些注意點,寫習慣了php的編碼或解碼,再來寫go的是真麻煩,php中直接一個json_encode()和json_decode()搞定!
---------------------
只要學不死!!
就往死裡學!!
--------------------- 狂神哥
基本使用-編碼
package main
import (
"encoding/json"
"fmt"
)
// Student 定義學生結構體
type Student struct {
Name string
Age int8
Score float64
}
func main() {
student :=&Student{
Name: "tom",
Age: 20,
Score: 89.50,
}
//返回兩個值,一個byte型別的切片,一個是err
byteInfo, err :=json.Marshal(student)
if err !=nil {
fmt.Println("json編碼失敗",err)
return
}
fmt.Println(string(byteInfo))
}
//列印的值如下
// {"Name":"tom","Age":20,"Score":89.5}
基本使用-解碼
package main
import (
"encoding/json"
"fmt"
)
type Student3 struct {
Name string `json:"name"`
Age int8 `json:"age,string"`
Score float64 `json:"score,omitempty"`
}
func main() {
var data=`{"name":"tom","age":"20","score":0.01}` //定義一個json串
//解碼成結構體
s2 :=&Student3{} //這裡需要定義接收變數,
err:=json.Unmarshal([]byte(data),s2)
if err !=nil {
fmt.Println("解碼失敗",err)
return
}
fmt.Println(*s2)
}
//列印的值如下:
{tom 20 0.01}
tag標籤的使用
功能一: 解決key值大小寫問題
在生產環境中,json格式的字串一般都是小寫開頭,但go編碼出來的json字串明顯不符合,解決這個問題需要使用tag標籤,有的小夥伴,就提出了問題,直接用小寫表示不就行了嗎?說多都是淚,直接上程式碼吧,先說結論 !結論是:如果是小寫字母開頭的話,編碼時會忽略小寫欄位
package main
import (
"encoding/json"
"fmt"
)
// Student2 定義學生結構體
type Student2 struct {
name string
age int8
score float64
}
func main() {
student :=&Student2{
name: "tom",
age: 20,
score: 89.50,
}
//返回兩個值,一個byte型別的切片,一個是err
byteInfo, err :=json.Marshal(student)
if err !=nil {
fmt.Println("json編碼失敗",err)
return
}
fmt.Println(string(byteInfo))
}
原因如下:
//在go中沒有像的別的語言中的public,protected private這種關鍵字來約束變數是公有還是受保護的,在go語言中是使用大小寫來區分的,只是要大寫開頭的變數,就可以在包外呼叫,小寫開頭的只能在包內使用,這也是為什麼小寫會被忽略的原因
解決辦法:
// Student2 定義學生結構體,只需要在改變如下就可以
type Student2 struct {
Name string `json:"name"`
Age int8 `json:"age"`
Score float64 `json:"score"`
}
//列印的資料如下,看到都可以變成小寫了
//{"name":"tom","age":20,"score":89.5}
功能二:忽略指定的欄位
//如果在go的結構體中有些欄位是沒有必要傳輸的,可以使用-這個符號 來忽略欄位
// Student2 定義學生結構體
type Student2 struct {
Name string `json:"-"` //這裡改變了
Age int8 `json:"age"`
Score float64 `json:"score"`
}
//輸入內容,則沒有name欄位了
{"age":20,"score":89.5}
功能三:可以序列化的時候忽略0值或空值
type Student2 struct {
Name string `json:"name"`
Age int8 `json:"age"`
Score float64 `json:"score,omitempty"`//這裡添加了omitempty標籤,如果是空值或零0值,則會忽略
}
student :=&Student2{
Name: "tom",
Age: 20,
Score: 0, //這個給個0值
}
//列印 輸出如下,沒有score欄位
{"name":"tom","age":20}
功能四:在編碼或解碼過程中,可以通過指定string,number,boolean來改變欄位型別
type Student2 struct {
Name string `json:"name"`
Age int8 `json:"age,string"` //把int8轉成string
Score float64 `json:"score,omitempty"`
}
//列印輸出
{"name":"tom","age":"20"}