下面看看乙個正常的結構體轉json是什麼樣子:
package mainimport (
"encoding/json"
"fmt")
// product 商品資訊
type product struct
func main()
p.name = "xiao mi 6"
p.isonsale = true
p.number = 10000
p.price = 2499.00
p.productid = 1
data, _ := json.marshal(p)
fmt.println(string(data))}
//結果
何為tag,tag就是標籤,給結構體的每個欄位打上乙個標籤,標籤冒號前是型別,後面是標籤名
// product _type product struct
// 序列化過後,可以看見
omitempty,tag裡面加上omitempy,可以在序列化的時候忽略0值或者空值
package mainimport (
"encoding/json"
"fmt")
// product _
type product struct
func main()
p.name = "xiao mi 6"
p.isonsale = false
p.number = 10000
p.price = 2499.00
p.productid = 0
data, _ := json.marshal(p)
fmt.println(string(data))
}// 結果
type,有些時候,我們在序列化或者反序列化的時候,可能結構體型別和需要的型別不一致,這個時候可以指定,支援string,number和boolean
注意:這個地方有個問題,實測go版本 1.14.2 如果字串是 "" 那麼會報錯:
json: invalid number literal, trying to unmarshal "\"\"" into number
package mainimport (
"encoding/json"
"fmt")
// product _
type product struct
func main() `
p := &product{}
err := json.unmarshal(byte(data), p)
fmt.println(err)
fmt.println(*p)
}// 結果
json.number 和type差不多 也是實現 string,int 相互轉換的,也是一樣有上面的問題,當在字串 「」 的時候 會json轉換失敗,但是低版本(1.13.0) go是不會報錯的
type test1 structcc := ``
var p1 test1
err := json.unmarshal(byte(cc),&p1)
fmt.println(err)
fmt.println(p1.name)
在很多業務場景下,比如說php返回的json,可能 id有時候是 1 有時候是 "1",你是無法保證的,通過tag和 json.number ,我實測在""空字串下會報錯。所以需要你自己實現乙個型別,然後實現對應的 marshaljson 和unmarshaljson 就可以了,下面看看**:
//轉換成intfunc (g *gint) unmarshaljson(data byte) error
data = bytes.trim(data, "\"")
if len(data) == 0
if bytes.equal(data, byte("null"))
in,err := strconv.atoi(string(data))
if err != nil
*g = gint(in)
return nil
}//轉換成json
func (g *gint) marshaljson() (data byte, err error)
func main()
cc := ``
var p1 test1
err := json.unmarshal(byte(cc),&p1)
fmt.println(err)
d := 1
dd := d+ int(p1.name)
fmt.println(p1.name)
fmt.println(dd)
}
上面**,我為 int 型別定義了乙個型別別名 gint,並且實現了 unmarshaljson 和 marshaljson 方法,支援了 「」 「11」 「abc」 "null" 的字串和 1,2,3,-4 常規的int。 unmarshaljson內部遮蔽了報錯,盡量保證json成功轉換而不報錯。
Golang JSON的高階用法例項講解
痛點 json 是當前最常用的資料傳輸格式之一,純文字,容易使用,方便閱讀,在通訊過程中大量被使用。你是否遇到過json中某個字段填入某種型別都適合而陷入兩難境地?例如 定義了乙個port欄位,你wcasu卻不知道是填入 8080 還是 8080 的尷尬局面 你是否遇到過json反解析報錯是因為填入...
Golang json用法詳解
簡介 json格式可以算我們日常最常用的序列化格式之一了,go語言作為乙個由google開發,號稱網際網路的c語言的語言,自然也對json格式支援很好。但是go語言是個強型別語言,對格式要求極其嚴格而json格式雖然也有型別,但是並不穩定,go語言在解析 為非強型別語言時比如php等序列化的json...
Golang json用法詳解(一)
json格式可以算我們日常最常用的序列化格式之一了,go語言作為乙個由google開發,號稱網際網路的c語言的語言,自然也對json格式支援很好。但是go語言是個強型別語言,對格式要求極其嚴格而json格式雖然也有型別,但是並不穩定,go語言在解析 為非強型別語言時比如php等序列化的json時,經...