Go语言学习笔记(十四)
一、JSon
JSON是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
语法规则
JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。
JSON是一个序列化的对象或数组。
- 六个构造字符:
begin-array = ws %x5B ws ; [ 左方括号
begin-object = ws %x7B ws ; { 左大括号
end-array = ws %x5D ws ; ] 右方括号
end-object = ws %x7D ws ; } 右大括号
name-separator = ws %x3A ws ; : 冒号
value-separator = ws %x2C ws ; , 逗号
- 在这六个构造字符的前或后允许存在无意义的空白符(ws):
ws = *(%x20 /; 空间
%x09 /; 水平标签
%x0A /; 换行或换行
%x0D); 回程
- JSON的值:
1 JSON的构成: ws 值 ws [1]
2值可以是对象、数组、数字、字符串或者三个字面值(false、null、true)中的一个。值中的字面值中的英文必须使用小写。
JSON 与 JS 对象的关系
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
例如
var obj = {a: 'Hello', b: 'World'};
var json = '{"a": "Hello", "b": "World"}';
使用json表达
{
"name": "中国",
"province": [{
"name": "黑龙江",
"cities": {
"city": ["哈尔滨", "大庆"]
}
}, {
"name": "广东",
"cities": {
"city": ["广州", "深圳", "珠海"]
}
}, {
"name": "台湾",
"cities": {
"city": ["台北", "高雄"]
}
}, {
"name": "新疆",
"cities": {
"city": ["乌鲁木齐"]
}
}]
}
JSON 简单的语法格式和清晰的层次结构容易阅读。
二、结构体,map,切片的序列化
结构体
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string
Age int
Birthday string
Sal float64
}
func testStruct() {
monster = Monster{
Name: "牛魔王",
Age: 500,
Birthday: "2011",
Sal: 8000.0,
}
data, err := json.Marshal(&monster)
if err != nil {
fmt.Println("序列错误 err=%v\n", err)
}
fmt.Println("monster序列化后=%v\n", string(data))
}
func main() {
testStruct()
}
map序列化
func testMap() {
var a map[string]interface{}
a = make(map[string]interface{})
a["name"] = "红孩儿"
a["age"] = "30"
a["address"] = "洪崖洞"
data, err := json.Marshal(map)
if err != nil {
fmt.Println("序列错误 err=%v\n", err)
}
fmt.Println("a map 序列化后%v\n", string(data))
}
对切片序列化
func testSlice() {
var slice []map[string]interface{}
var m1 map[string]interface{}
m1 = make(map[string]interface{})
m1["name"] = "jack"
m1["age"] = "20"
m1["address"] = "en"
data, err := json.Marshal(slice)
if err != nil {
fmt.Println("序列错误 err=%v\n", err)
}
fmt.Println("切片序列化后=%v\n", string(data))
}
对基本数据序列化
func testFloat64() {
var num1 float64 = 2345.67
data, err := json.Marshal(slice)
if err != nil {
fmt.Println("序列错误 err=%v\n", err)
}
fmt.Println("切片序列化后=%v\n", string(data))