简介
json是一种数据交换的格式,在前后端的交互中有广泛的应用。我们来举一个例子
package main
import (
"encoding/json"
"fmt"
)
type people struct {
Name string `json:"name"`
age int
Sex string `json:"sex"`
Car1 *Car
}
type Car struct {
Logo string `json:"logo"`
}
func main() {
var p1 people
p1.Name = "hahaha"
p1.Sex = "男"
p1.age = 12
var car1 Car
car1.Logo = "大众"
p1.Car1 = &car1
s, _ := json.Marshal(p1)
fmt.Print(string(s))
}
代码运行的结果是
{"name":"hahaha","sex":"男","Car1":{"logo":"大众"}}
我们所能得出的结论是:
首字母未大写的成员不可被转换成json形式
转换成json后会自动使用变量的标签作为名称
指针变量会自动转化成为所指向的对象
json的解析
json.Unmarshal(s, &p2)
fmt.Print(p2)
fmt.Print(p2.Car1.Logo)
{hahaha 0 男 0xc000056330}大众
由此可见,虽然在json中显示了指针所指向的对象,但是,指针变量解析出来还是一个指针,若遇到不存在的项则自动设为0值
Marshal函数只有在转换成功的时候才会返回数据,在转换的过程中我们需要注意几点:
JSON对象只支持string作为key,所以要编码一个map,那么必须是map[string]T这种类型(T是Go语言中任意的类型)
Channel, complex和function是不能被编码成JSON的
嵌套的数据是不能编码的,不然会让JSON编码进入死循环
json的特殊字符串处理
json对格式的要求非常严格,这也造成了特殊字符串的存取困难,我们在存取前应对特殊字符进行转义
switch (c) {
case '\"':
sb.append("\\\"");
break;
case '\\':
sb.append("\\\\");
break;
case '/':
sb.append("\\/");
break;
case '\b':
sb.append("\\b");
break;
case '\f':
sb.append("\\f");
break;
case '\n':
sb.append("\\n");
break;
case '\r':
sb.append("\\r");
break;
case '\t':
sb.append("\\t");
break;
default:
sb.append(c);
}