通过结构体生成json文件
默认情况下从结构体生成json格式,结构体的成员首字母必须大写,结构体名可以小写,因为在本包使用 Marshal
方法是从本包传结构体到json的包让它编码,它肯定能访问到结构体,但是成员如果小写,json的包就无法调用到
|
|
Marshal()会返回两个值,一个json内容一个错误值,可以用If语句接受错误,然后用return让main函数中断,return在函数中的意义:如果函数返回值有定义,则return表示返回数据,如果没有定义返回值,return就表示退出此函数,在main函数中有return就表示中断程序但是不会报错
buf获得的值是一个字节切片类型,可以直接string(buf)强转成string类型
转换成string后输出的是一个整体值,无法再用切片[0]来调用任意一个成员
通过map生成json文件
MarshalIndent()的第三个参数为一个TAB键字符串
json解析到结构体(json解码)
json的变量名是小写,而结构体的首字母是大写,所以可以通过对结构体二次编码来关联上,不建议将结构体的首字母变成小写,因为如果变成小写的话,以后又需要生成json就会失败,并且如果程序其他地方有使用到这个结构体,成员名赋值也需要修改
Unmarshal()有两个参数,一个是byte切片类型(通过强转jsonBuf获得),一个是结构体的指针,放指针是因为给函数传结构体变量属于值传递,并不会修改本身结构体的内容,是拷贝了一份新的结构体给函数,只有通过指针实现引用传递才可以修改本身结构体内容,这个函数的返回值只有error
如果只需要部分解析,可以重新定义一个只含有部分成员的结构体来接受解析内容
json解析到map
map也需要传递指针过去,这里原理不太清楚,但是测试过发现不加指针&就无法对原值进行修改,尽管map属于引用传递
如果通过map接受解析的值,它接受到的值类型都属于空接口类型,对其强转string(m[“test”])是无法成功的,需要使用switch断言来回推类型进行赋值
switch可以在赋值的同时进行判断,即 switch a := 3; 判断的是st的值,空接口类型断言隐性的将data的类型放在了判断上面,且将data空接口类型自动转换成适合它的类型
推荐使用结构体来解析,因为map如果要确定值的类型就需要断言,过于麻烦