golang标准库中的encoding/json包

1、什么是JSON?
2、go标准库json包的内容?
3、开发中常用json操作?

一、什么是JSON?
JSON简单的理解就是特殊格式的字符串,被设计用来传输和存储数据,和xml类似,但是在API和前后端分离数据交互更多是使用json,json不仅比XML简单,传输中更节省文本。网站中的ajax、后端api基本上是使用json编码后的数据。

二、go标准库json包的内容?
结构体
1)type InvalidUTF8Error

func (e *InvalidUTF8Error) Error() string
Go1.2之前版本,当试图编码一个包含非法utf-8序列的字符串时会返回错误。Go1.2及之后版本,编码器会强行将非法字节替换为unicode字符U+FFFD来使字符串合法。本错误已不再出现,但出于向后兼容考虑而保留。

2)type InvalidUnmarshalError

func (e *InvalidUnmarshalError) Error
InvalidUnmarshalError用于描述一个传递给解码器的非法参数。(解码器的参数必须是非nil指针)

3)type SyntaxError

func (e *SyntaxError) Error() string
SyntaxError表示一个json语法错误。

4)type UnmarshalFieldError

func (e *UnmarshalFieldError) Error() string

UnmarshalFieldError表示一个json对象的键指向一个非导出字段。(因此不能写入;已不再使用,出于兼容保留)
5)type UnmarshalTypeError

func (e *UnmarshalTypeError) Error() string
UnmarshalTypeError表示一个json值不能转化为特定的go类型的值。

6)type UnsupportedTypeError

func (e *UnsupportedTypeError) Error() string
UnsupportedTypeError表示试图编码一个不支持类型的值。

7)type UnsupportedValueError

func (e *UnsupportedValueError) Error() string

8)type MarshalerError

func (e *MarshalerError) Error() string

9)type Number string
Number类型代表一个json数字字面量

func (n Number) Int64() (int64, error)
将该数字作为int64类型返回
func (n Number) Float64() (float64, error)
将该数字作为float64类型返回
func (n Number) String() string
返回该数字的字面值文本表示

10)type RawMessage []byte
RawMessage类型是一个保持原本编码的json对象。本类型实现了Marshaler和Unmarshaler接口,用于延迟json的解码或预计算json的编码。

func (m *RawMessage) MarshalJSON() ([]byte, error)
MarshalJSON返回 *m 的json编码。
func (m *RawMessage) UnmarshalJSON(data []byte) error
UnmarshalJSON将*m设为data的一个拷贝

代码案例

package main

import (
    "encoding/json"
    "github.com/lunny/log"
    "fmt"
)

func main() {
    var raw json.RawMessage
    j, err := raw.MarshalJSON()
    if err != nil {
        log.Println(err)
    }
    fmt.Println(string(j))
    err = raw.UnmarshalJSON([]byte(`{"name":"lai"}`))
    if err != nil {
        log.Println(err)
    }
    j, err = raw.MarshalJSON()
    if err != nil {
        log.Println(err)
    }
    fmt.Println(string(j))
}

11)type Marshaler interface

实现了Marshaler接口的类型可以将自身序列化为合法的json描述。

12)type Unmarshaler interface

实现了Unmarshaler接口的对象可以将自身的json描述反序列化。该方法可以认为输入是合法的json字符串。如果要在方法返回后保存自身的json数据,必须进行拷贝。

函数
1)func HTMLEscape(dst *bytes.BUffer, src []byte)

HTMLEscape 函数将json编码的src中的<、>、&、U+2028和U+2029字符替换为\u003c、\u003e、\u0026、\u2028、\u2029转义字符串,以便json编码可以安全的嵌入HTML的<script>标签里。因为历史原因,网络浏览器不支持<script>标签中使用标准HTML转义,因此必须使用另一种json编码方案。

代码案例

package main

import (
    "encoding/json"
    "bytes"
    "fmt"
)

func main() {
    src := []byte(`{"name":"<lai>"}`)
    buffer := bytes.NewBuffer(nil)
    json.HTMLEscape(buffer, src)
    fmt.Println(buffer.String())
}
// 输出:{"name":"\u003clai\u003e"}

2)func Indent(dst *Bytes.Buffer, src []byte, prefix, indent string)

Indent函数将json编码的调整缩进之后写入dst。每一个json元素/数组都另起一行开始,以prefix为起始,一或多个indent缩进(数目看)

代码案例

package main

import (
    "encoding/json"
    "log"
    "fmt"
    "bytes"
    "os"
)

type Student struct {
    Name string
    Age int
}

func main() {
    ss := []Student{
        {"lai",12},
        {"ada",15}}
    b, err := json.Marshal(ss)
    if err != nil {
        log.Fatalln(err)
    }
    fmt.Println(string(b))
    var out bytes.Buffer
    json.Indent(&out, b, "", "\t")
    out.WriteTo(os.Stdout)
    fmt.Println(string(b))
}

3)func Marshal(v interface{}) ([]byte, error)
递归进行json编码
4)func MarshalIndent(v interface{}, prefix, index string) ([]byte, error)
Marshallndent类似Marshal但会使用缩进将输出格式化。
5)func Unmarshal(data []byte, v interface{}) error
json解码

type Decoder struct
1)func NewDecoder(r io.Reader) Decoder
NewDecoder创建一个从r读取并解码json对象的
Decoder,解码器有自己的缓冲,并可能超前读取部分json数据。
2)func (dec *Decoder) UseNumber()
UseNumber方法将dec设置为当接收端是Interface{}接口时将json数字解码为Number类型而不是float64类型。
3)func (dec *Decoder) Decode(v interface{}) error
Decode从输入流读取下一个json编码值并保持在v指向的值里。

type Encoder struct
1)func NewEncoder(w io.Writer) Encoder
NewEncoder创建一个将数据写入w的
Encoder。
2)func (enc *Encoder) Encode(v interface{}) error
Encode将v的json编码写入输出流,并会写入一个换行符。

三、开发中常用json操作
编码:
1)func Marshal(v interface{}) ([]byte, error)

解码:
2)func UnMarshal(data []byte, v interface{}) error

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容