文章目录
JSON(JavaScript Object Notation) 是轻量级的文本数据交换格式,独立于语言,具有自我描述性。JSON 类似于 XML,但比 XML 更小、更快,更易解析。
1.语法
JSON 语法是 JavaScript 对象表示法语法的子集。
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
json
"firstName" : "John"
一个合法的 JSON 可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 布尔(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
JSON 对象在花括号中书写,对象可以包含多个名称/值对,使用逗号分隔:
json
{ "firstName":"John" , "lastName":"Doe" }
JSON 数组在方括号中书写,数组可包含多个对象:
json
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
2.实例
下面以 JSON 表示一个简单的后台服务配置:
json
{
"-name": "UserProfileServer",
"maxconns": "1000",
"queuecap": "10000",
"queuetimeout": "300",
"loginfo": {
"loglevel": "ERROR",
"logsize": "10M",
"lognum": "10",
"logpath": "/usr/local/app/log"
}
}
其中 -name 表示服务的名称,前面一个横杠表示该值可以转换为 XML 的标签属性。其它的键值对表示服务的各个配置项。
3.解析
下面以 Go 为例,利用 Go 自带的 JSON 包 encoding/json 完成对上面服务配置的解析。
第一步,将 JSON 串转换为 Go struct。把上面的 JSON 串粘贴到 Convert JSON to Go struct。
go
type Server struct {
Name string `json:"-name"`
Maxconns string `json:"maxconns"`
Queuecap string `json:"queuecap"`
Queuetimeout string `json:"queuetimeout"`
Loginfo struct {
Loglevel string `json:"loglevel"`
Logsize string `json:"logsize"`
Lognum string `json:"lognum"`
Logpath string `json:"logpath"`
} `json:"loginfo"`
}
第二步,利用 Go 自带的 JSON 包 encoding/json 解析上面以 JSON 串表示的配置信息。
go
package main
import(
"encoding/json"
"io/ioutil"
"fmt"
"os"
)
func main() {
file, err := os.Open("server.json")
if err != nil {
fmt.Printf("error:%v\n", err)
return
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err != nil {
fmt.Printf("error: %v", err)
return
}
v := Server{}
err = json.Unmarshal(data, &v)
if err != nil {
fmt.Printf("error:%v\n", err)
return
}
fmt.Printf("%+v\n", v)
}
运行输出:
{Name:UserProfileServer Maxconns:1000 Queuecap:10000 Queuetimeout:300 Loginfo:{Loglevel:ERROR Logsize:10M Lognum:10 Logpath:/usr/local/app/log}}