通过golang处理json文件

通过结构体生成json文件

默认情况下从结构体生成json格式,结构体的成员首字母必须大写,结构体名可以小写,因为在本包使用 Marshal方法是从本包传结构体到json的包让它编码,它肯定能访问到结构体,但是成员如果小写,json的包就无法调用到

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
type person struct {
	Name string
	Age  int
}
func main() {
	p1 := person{"张三",19}
	b, _ := json.Marshal(p1)
	fmt.Println(string(b))

	var p2 person
	json.Unmarshal(b, &p2)	//结构体是值传递,如果不使用指针就只会修改副本,不会修改p2原有的内容
	fmt.Println(p2)
}

Marshal()会返回两个值,一个json内容一个错误值,可以用If语句接受错误,然后用return让main函数中断,return在函数中的意义:如果函数返回值有定义,则return表示返回数据,如果没有定义返回值,return就表示退出此函数,在main函数中有return就表示中断程序但是不会报错

image.png

buf获得的值是一个字节切片类型,可以直接string(buf)强转成string类型

image.png

转换成string后输出的是一个整体值,无法再用切片[0]来调用任意一个成员

通过map生成json文件

image.png

MarshalIndent()的第三个参数为一个TAB键字符串

json解析到结构体(json解码)

image.png

json的变量名是小写,而结构体的首字母是大写,所以可以通过对结构体二次编码来关联上,不建议将结构体的首字母变成小写,因为如果变成小写的话,以后又需要生成json就会失败,并且如果程序其他地方有使用到这个结构体,成员名赋值也需要修改

image.png

Unmarshal()有两个参数,一个是byte切片类型(通过强转jsonBuf获得),一个是结构体的指针,放指针是因为给函数传结构体变量属于值传递,并不会修改本身结构体的内容,是拷贝了一份新的结构体给函数,只有通过指针实现引用传递才可以修改本身结构体内容,这个函数的返回值只有error

如果只需要部分解析,可以重新定义一个只含有部分成员的结构体来接受解析内容

image.png

json解析到map

image.png

map也需要传递指针过去,这里原理不太清楚,但是测试过发现不加指针&就无法对原值进行修改,尽管map属于引用传递

如果通过map接受解析的值,它接受到的值类型都属于空接口类型,对其强转string(m[“test”])是无法成功的,需要使用switch断言来回推类型进行赋值

image.png

switch可以在赋值的同时进行判断,即 switch a := 3; 判断的是st的值,空接口类型断言隐性的将data的类型放在了判断上面,且将data空接口类型自动转换成适合它的类型

推荐使用结构体来解析,因为map如果要确定值的类型就需要断言,过于麻烦

Licensed under CC BY-NC-SA 4.0