内容简介:json的全称是 JavaScript Object Notation,是一种轻量级的数据交换格式。易于人阅读和编写,同时易于机器解析和生成。json有两种类型的数据,用go语言来描述这两种类型:golang标准库encoding/json是用来处理json数据的,它有两组函数或者方法来处理json数据。
golang 标准库(encoding/json)学习
什么是json
json的全称是 JavaScript Object Notation,是一种轻量级的数据交换格式。易于人阅读和编写,同时易于机器解析和生成。
json有两种类型的数据,用 go 语言来描述这两种类型:
- map “名称/值”对,用{}标识
-
slice 也可以说是数组,用[]标识
{ "Name": "Joe", "Age": 18, } ["apple", "banana", "pear"]
golang如何处理json
golang标准库encoding/json是用来处理json数据的,它有两组函数或者方法来处理json数据。
| 函数名 | 输入 | 输出 | 描述 |
|---|---|---|---|
| Marshal | v interface{} | []byte, error | 编码v成json数据 To Json |
| Unmarshal | []byte, v(指针) | error | 解码json,储存在v中 From Json |
| Encode | v interface{} | error | 编码v成json数据 输出到 io.Writer |
| Decode | v (指针) | error | 解码json, 输入来自io.Reader |
编码函数
编码函数: func Marshal(v interface{}) ([]byte, error)
编码规则: 递归遍历v,v中的一个值实现了 Marshaler interface ,调用 MarshalJSON method 去编码,如果没有这种方法,但是实现了 encoding.TextMarshl 那么使用 MarshalText 去编码。
编码对应表:
| go value | JSON value |
|---|---|
| 布尔型(true false) | 布尔型(true false) |
| 浮点数 | 数字型 |
| 整数 | 数字型 |
| 字符型 | 字符型 |
| 数组 切片 | 数组 |
| byte 数组 | base-64 encoded 字符串 |
| nil 数组 | null |
| 结构体 | JSON 对象 |
| map | JSON 对象 |
JSON 结构体中TAG
使用json key来标识这个结构体中的field,对应编码后json中key值。
omitempty 如果值是false, 0, 空指针,空接口,空数组,空切片,空映射,空字符串,将被忽略。
“-” 这个field将会被忽略。
示例代码: https://github.com/MoonNan/go...
其他编码函数: func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
格式化编码输出
示例代码: https://github.com/MoonNan/go...
解码函数
解码函数: func Unmarshal(data []byte, v interface{}) error
- data 是一个JSON数据
- v 是存储解码数据的指针
- error 返回的错误类型
各类型解码
-
指针
- null解码成空指针
- 指针非空,解码成指针指向的数据
- 指针为空,解码函数为他创建新指针,并且为其填充数据。
-
接口
- UnmarshalJSON method
- UnmarshlText method
-
结构体
- field(tags)相对应解码
- 碰到不匹配field,忽略掉(默认行为)
-
切片
- reset slice length to 0, 添加元素到slice
- 空的JSON 数组,重新生成一个空slice
-
数组
- go数组小于JSON数组,多余的将忽略
- go数组大于JSON数组,多余填充0值
-
映射
- 映射为nil, 重新生成map,填充数据返回
- 映射非空,直接填充数据
编码器
流程:
-
调用 func NewEncoder(w io.Writer) *Encoder
生成一个编码器
这里input是一个io.Writer, 返回的是一个Encoder的指针 - 调用Encode方法,把编码数据发送到io.Writer, 后面会跟一个换行符
辅助方法:
SetEscapeHTML 和 函数HTMLEscape 同样的效果
SetIndent 和 MarshalIndent 同样的效果
解码器
流程:
-
调用 func NewDecoder(r io.Reader) *Decoder
生成一个解码器
输入是一个io.Reader,返回一个解码器 - 调用Decode方法解码
辅助方法:
Buffered 数据暂存在解码器的buffer中,等下一次调用Decode再重新解码到io.Reader
DisallowUnknownField 如果解码的field和接收的field不匹配将会报错
More 是否有新的数组或者对象可以解析
Token 下一个JSON的token
UseNumber 使用interface{}处理数字型而不是float
RawMessage
RawMessage 是已经预先编码好的JSON数据,他可以实现延迟解码,或者联合其他数据重新编码。
辅助函数
function Compact(* bytes.Buffer, []byte) err
compact的意思是把...紧压在一起, 我们可以这样理解,buffer之中已经有一些数据,我们希望把编码后的json数据,加入到buffer中去。
代码示例: https://github.com/MoonNan/go...
var b bytes.Buffer \\ 声明变量
n, err := b.Write([]byte("Employee info: \n")) \\buffer中填充一些数据
err = json.Compact(&b, jData) //把json数据添加到buffer中去
b.WriteTo(os.Stdout) //输出到标准输出
/*
jdata的内容 {"name":"joe","age":20,"hobby":["Basketball","Football","Reading"]}
标准输出的内容
Employee info:
{"name":"joe","age":20,"hobby":["Basketball","Football","Reading"]}
*/
func HTMLEscape(dst *bytes.Buffer, src []byte)
我们知道<,>,&在html的语法中有自己的意义,如果我们编码的json中有这些字符,html的<script></script>使用json数据,这容易引起页面的问题。这个函数就是把这几个字符转化成unicode字符。
| Source | Destination |
|---|---|
| < | u003c |
| > | u003e |
| & | u0026 |
| u+2028 | u2028 |
| u+2029 | u2029 |
实例代码:https://github.com/MoonNan/gostandlib-study/blob/master/encoding/json/HTMLEscape-example.go
// 编码前的数据:
myTeams := []jdata.Person{
{"Joe", 18, []string{"<basketball>", "<football>", "<reading>"}},
{"Jason", 20, []string{"pingpang&basketball", "Swim"}},
{"Smith", 19, []string{"game&game"}},
}
[{"name":"Joe","age":18,"hobby":["\u003cbasketball\u003e","\u003cfootball\u003e","\u003creading\u003e"]},{"name":"Jason","age":20,"hobby":["pingpang\u0026basketball","Swim"]},{"name":"Smith","age":19,"hobby":["game\u0026game"]}]
func Valid(data []byte) bool
data是不是一个可用的JSON编码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- go标准库(fmt)学习
- APUE 学习笔记——UNIX 标准及实现
- 零学习成本:使用 Web 标准开发动态化 Flutter 应用
- "零"学习成本:使用 Web 标准开发动态化 Flutter 应用
- 少说话多写代码之Python学习058——标准模块(集合)
- 少说话多写代码之Python学习059——标准模块(堆)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
MySQL入门很简单
黄缙华 / 清华大学出版社 / 2011-1 / 59.50元
《MySQL入门很简单》从初学者的角度出发,由浅入深,循序渐进地介绍了mysql数据库应用与开发的相关知识。书中提供了大量操作mysql数据库的示例,还提供了大量实例和上机实践内容,供读者演练。《MySQL入门很简单》附带1张dvd光盘,内容为与《MySQL入门很简单》内容完全配套的多媒体教学视频和《MySQL入门很简单》涉及的源代码。 《MySQL入门很简单》共分5篇。第1篇介绍数据库的基......一起来看看 《MySQL入门很简单》 这本书的介绍吧!