有時(shí)會(huì)有這種需求,將一個(gè)json數(shù)據(jù)形如:
{"x":"golang", "y":"520.1314"}
中的y反序列化為浮點(diǎn)類型,如果這樣寫:
package main
import (
"encoding/json"
"fmt"
)
type JsonTest struct {
X string `json:"x"`
Y float64 `json:"y"`
}
func main() {
s := `{"x":"golang", "y":"520.1314"}`
var jt JsonTest
err := json.Unmarshal([]byte(s), jt)
if err == nil {
fmt.Printf("%+v\n", jt)
} else {
fmt.Println(err)
fmt.Printf("%+v\n", jt)
}
}
會(huì)報(bào)錯(cuò):
json: cannot unmarshal string into Go struct field JsonTest.y of type float64
將結(jié)構(gòu)體JsonTest定義改為如下,即可解決戰(zhàn)斗:
type JsonTest struct {
X string `json:"x"`
Y float64 `json:"y,string"`
}
這樣寫可以告訴golang的json解釋器變量y是被編碼成字符串的浮點(diǎn)數(shù)
補(bǔ)充:golang中struct、json、map互相轉(zhuǎn)化
一、Json和struct互換
(1)Json轉(zhuǎn)struct例子:
package main
import (
"fmt"
"encoding/json"
)
type People struct {
Name string `json:"name_title"`
Age int `json:"age_size"`
}
func JsonToStructDemo(){
jsonStr := `
{
"name_title": "jqw"
"age_size":12
}
`
var people People
json.Unmarshal([]byte(jsonStr), people)
fmt.Println(people)
}
func main(){
JsonToStructDemo()
}
輸出:
注意json里面的key和struct里面的key要一致,struct中的key的首字母必須大寫,而json中大小寫都可以。
(2)struct轉(zhuǎn)json
在結(jié)構(gòu)體中引入tag標(biāo)簽,這樣匹配的時(shí)候json串對(duì)應(yīng)的字段名需要與tag標(biāo)簽中定義的字段名匹配,當(dāng)然tag中定義的名稱不需要首字母大寫,且對(duì)應(yīng)的json串中字段名仍然大小寫不敏感。此時(shí),結(jié)構(gòu)體中對(duì)應(yīng)的字段名可以不用和匹配的一致,但是首字母必須大寫,只有大寫才是可對(duì)外提供訪問的。
例子:
package main
import (
"fmt"
"encoding/json"
)
type People struct {
Name string `json:"name_title"`
Age int `json:"age_size"`
}
func StructToJsonDemo(){
p := People{
Name: "jqw",
Age: 18,
}
jsonBytes, err := json.Marshal(p)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(jsonBytes))
}
func main(){
StructToJsonDemo()
}
輸出:
二、json和map互轉(zhuǎn)
(1)json轉(zhuǎn)map例子:
func JsonToMapDemo(){
jsonStr := `
{
"name": "jqw",
"age": 18
}
`
var mapResult map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), mapResult)
if err != nil {
fmt.Println("JsonToMapDemo err: ", err)
}
fmt.Println(mapResult)
}
輸出:
(2)map轉(zhuǎn)Json例子
func MapToJsonDemo1(){
mapInstances := []map[string]interface{}{}
instance_1 := map[string]interface{}{"name": "John", "age": 10}
instance_2 := map[string]interface{}{"name": "Alex", "age": 12}
mapInstances = append(mapInstances, instance_1, instance_2)
jsonStr, err := json.Marshal(mapInstances)
if err != nil {
fmt.Println("MapToJsonDemo err: ", err)
}
fmt.Println(string(jsonStr))
}
輸出:
例2:
func MapToJsonDemo2(){
b, _ := json.Marshal(map[string]int{"test":1, "try":2})
fmt.Println(string(b))
}
輸出:
三、map和struct互轉(zhuǎn)
(1)map轉(zhuǎn)struct
需要安裝一個(gè)第三方庫(kù)
在命令行中運(yùn)行: go get github.com/goinggo/mapstructure
例子:
func MapToStructDemo(){
mapInstance := make(map[string]interface{})
mapInstance["Name"] = "jqw"
mapInstance["Age"] = 18
var people People
err := mapstructure.Decode(mapInstance, people)
if err != nil {
fmt.Println(err)
}
fmt.Println(people)
}
輸出
(2)struct轉(zhuǎn)map例子
func StructToMapDemo(obj interface{}) map[string]interface{}{
obj1 := reflect.TypeOf(obj)
obj2 := reflect.ValueOf(obj)
var data = make(map[string]interface{})
for i := 0; i obj1.NumField(); i++ {
data[obj1.Field(i).Name] = obj2.Field(i).Interface()
}
return data
}
func TestStructToMap(){
student := Student{10, "jqw", 18}
data := StructToMapDemo(student)
fmt.Println(data)
}
輸出:
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- go浮點(diǎn)數(shù)轉(zhuǎn)字符串保留小數(shù)點(diǎn)后N位的完美解決方法
- 解決Golang中g(shù)oroutine執(zhí)行速度的問題
- 解決golang結(jié)構(gòu)體tag編譯錯(cuò)誤的問題
- golang 實(shí)現(xiàn)Location跳轉(zhuǎn)方式
- 解決golang post文件時(shí)Content-Type出現(xiàn)的問題
- 對(duì)Golang中的FORM相關(guān)字段理解
- golang 打印error的堆棧信息操作
- golang 比較浮點(diǎn)數(shù)的大小方式