golang中json序列号大小写的问题

go中根据首字母的大小写来确定可以访问的权限。如果首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用。

1.struct转json序列化

//demo1
package main
import (
 "fmt"
 "encoding/json"
)

type Person struct {
    Name string
    age int
}

func main() {
    person := Person {"小明", 18}
    if result,err :=json.Marshal(&person); err==nil{
        fmt.Println(string(result))
    }
}

运行结果:{“Name”:“小明”},发现没有年龄,因为struct中age没有首字母大写。

将age修改成Age后,运行结果:{“Name”:“小明”,“Age”:18}

如果想让struct转json序列号后的首字母小写,可以通过字段的tag指定

//demo2
package main
import (
 "fmt"
 "encoding/json"
)

type Person struct {
    Name string `json:"Name"`
    Age int     `json:"age"`
}

func main() {
    person := Person {"小明", 18}
    if result,err :=json.Marshal(&person); err==nil{
        fmt.Println(string(result))
    }
}

2.struct嵌套struct的序列号问题

package main

import (
	"encoding/json"
	"fmt"
)

type Position struct {
	X int
	Y int
	Z int
}

type Student struct {
	Name     string
	Sex      string
	Age      int
	position Position
}

func main() {
	position1 := Position{10, 20, 30}
	student1 := Student{"zhangsan", "male", 20, position1}
	position2 := Position{15, 10, 20}
	student2 := Student{"lisi", "female", 18, position2}

	var srcSlice = make([]Student, 2)
	srcSlice[0] = student1
	srcSlice[1] = student2
	fmt.Printf("Init:srcSlice is : %v\n", srcSlice)
	data, err := json.Marshal(srcSlice)
	if err != nil {
		fmt.Printf("Serialize:json.Marshal error! %v\n", err)
		return
	}
	fmt.Println("After serialize, data : \n", string(data))

	var dstSliece = make([]Student, 2)
	err = json.Unmarshal(data, &dstSliece)
	if err != nil {
		fmt.Printf("Deserialize: json.Unmarshal error! %v\n", err)
		return
	}
	fmt.Printf("Deserialize:dstSlice is : %v\n", dstSliece)
}

运行结果:

Init:srcSlice is : [{zhangsan male 20 {10 20 30}} {lisi female 18 {15 10 20}}]
After serialize, data :
 [{"Name":"zhangsan","Sex":"male","Age":20},{"Name":"lisi","Sex":"female","Age":18}]
Deserialize:dstSlice is : [{zhangsan male 20 {0 0 0}} {lisi female 18 {0 0 0}}]

发现序列化的结果没有问题,反序列化的结果中position内容都是0,定位原因是Student中变量名position是小写开头。改成大写后再观察结果,可以正常序列化。

对于json串,很多人喜欢全小写,同样可以通过字段的tag指定。

参考:golang中json序列化需要注意

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值