- JavaScript对象表示法(JSON)是一种用于发送和接收结构化信息的标准协议。在 类似的协议中,JSON并不是唯一的一个标准协议。 XML(§7.14)、ASN.1和 Google的Protocol Buffers都是类似的协议,并且有各自的特色,但是由于简洁性、 可读性和流行程度等原因,JSON是应用最广泛的一个。
- Go语言对于这些标准格式的编码和解码都有良好的支持,由标准库中 的 encoding/json 、 encoding/xml 、 encoding/asn1 等包提供支持并且这类包都有着相似的API接口。本节,我们将对重要的 encoding/json 包的 用法做个概述。
- JSON是对JavaScript中各种类型的值——字符串、数字、布尔值和对象—— Unicode本文编码。它可以用有效可读的方式表示基础数据类型和数组、slice、结 构体和map等聚合数据类型。
- 基本的JSON类型有数字(十进制或科学记数法)、布尔值(true或false)、字符 串,其中字符串是以双引号包含的Unicode字符序列,支持和Go语言类似的反斜杠 转义特性,不过JSON使用的是 \Uhhhh 转义数字来表示一个UTF-16编码(译注: UTF-16和UTF-8一样是一种变长的编码,有些Unicode码点较大的字符需要用4个 字节表示;而且UTF-16还有大端和小端的问题),而不是Go语言的rune类型。
- 这些基础类型可以通过JSON的数组和对象类型进行递归组合。
- 一个JSON数组是一个有序的值序列,写在一个方括号中并以逗号分隔;一个 JSON数组可以用于编码Go语言的数组和slice。
- 一个JSON对象是一个字符串到值的映射,写成一系列的name:value对形式,用花 括号包含并以逗号分隔;JSON的对象类型可以用于编码Go语言的map类型(key 类型是字符串)和结构体。
// test13_json project main.go
package main
import (
"encoding/json"
"fmt"
"log"
)
type Movie struct {
Title string
Year int `json:"released"`
Color bool `json:"color,omitempty"`
Actors []string
}
var movies = []Movie{
{
Title: "战狼2",
Year: 2017,
Color: true,
Actors: []string{"吴京", "吴刚"},
},
{
Title: "老炮儿",
Year: 2015,
Color: true,
Actors: []string{"冯小刚", "吴亦凡", "许晴"},
},
{
Title: "Bullitt",
Year: 1968,
Color: false,
Actors: []string{"Steve McQueen", "Jacqueline Bisset"},
},
}
func main() {
/*
注意json 编解码只能处理结构体成员变量是大写的字段,小写的直接忽略
如果在编码时想让json字符串的字段小写,那么需要再结构体中加Tag
如果再解码时,json有小写的字段名,那么在定义结构体接收的 时候,成员名要大写,然后也要加Tag
*/
//编码,将go结构体转换成json字符串
//json_str, err :=json.Marshal(movies)
json_data, err := json.MarshalIndent(movies, "", " ") // 带缩进的输出格式
if err != nil {
log.Fatal(err)
return
}
fmt.Printf("%s\n", json_data)
fmt.Println("-----------------------------")
var titles []struct {
Title string
}
if err := json.Unmarshal(json_data, &titles); err != nil {
log.Fatal(err)
return
}
fmt.Printf("%+v\n", titles)
var years []struct {
Year int `json:"released"`
}
if err := json.Unmarshal(json_data, &years); err != nil {
log.Fatal(err)
return
}
fmt.Printf("%+v\n", years)
var actors []struct {
Actors []string
}
if err := json.Unmarshal(json_data, &actors); err != nil {
log.Fatal(err)
return
}
fmt.Printf("%+v\n", actors)
fmt.Println("--------------------------")
var my_movies []struct {
Title string
Year int `json:"released"`
Actors []string
}
if err := json.Unmarshal(json_data, &my_movies); err != nil {
log.Fatal(err)
return
}
fmt.Printf("%+v\n", my_movies)
}
输出如下:
[
{
"Title": "战狼2",
"released": 2017,
"color": true,
"Actors": [
"吴京",
"吴刚"
]
},
{
"Title": "老炮儿",
"released": 2015,
"color": true,
"Actors": [
"冯小刚",
"吴亦凡",
"许晴"
]
},
{
"Title": "Bullitt",
"released": 1968,
"Actors": [
"Steve McQueen",
"Jacqueline Bisset"
]
}
]
-----------------------------
[{Title:战狼2} {Title:老炮儿} {Title:Bullitt}]
[{Year:2017} {Year:2015} {Year:1968}]
[{Actors:[吴京 吴刚]} {Actors:[冯小刚 吴亦凡 许晴]} {Actors:[Steve McQueen Jacqueline Bisset]}]
--------------------------
[{Title:战狼2 Year:2017 Actors:[吴京 吴刚]} {Title:老炮儿 Year:2015 Actors:[冯小刚 吴亦凡 许晴]} {Title:Bullitt Year:1968 Actors:[Steve McQueen Jacqueline Bisset]}]
成功: 进程退出代码 0.
来源:oschina
链接:https://my.oschina.net/u/4243209/blog/3208244
