golang標準庫中的encoding/json包

1、什么是JSON软瞎?
2逢唤、go標準庫json包的內容?
3涤浇、開發(fā)中常用json操作鳖藕?

一、什么是JSON只锭?
JSON簡單的理解就是特殊格式的字符串著恩,被設計用來傳輸和存儲數(shù)據(jù),和xml類似蜻展,但是在API和前后端分離數(shù)據(jù)交互更多是使用json喉誊,json不僅比XML簡單,傳輸中更節(jié)省文本纵顾。網(wǎng)站中的ajax伍茄、后端api基本上是使用json編碼后的數(shù)據(jù)。

二施逾、go標準庫json包的內容敷矫?
結構體
1)type InvalidUTF8Error

func (e *InvalidUTF8Error) Error() string
Go1.2之前版本例获,當試圖編碼一個包含非法utf-8序列的字符串時會返回錯誤。Go1.2及之后版本曹仗,編碼器會強行將非法字節(jié)替換為unicode字符U+FFFD來使字符串合法榨汤。本錯誤已不再出現(xiàn),但出于向后兼容考慮而保留怎茫。

2)type InvalidUnmarshalError

func (e *InvalidUnmarshalError) Error
InvalidUnmarshalError用于描述一個傳遞給解碼器的非法參數(shù)收壕。(解碼器的參數(shù)必須是非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數(shù)字字面量

func (n Number) Int64() (int64, error)
將該數(shù)字作為int64類型返回
func (n Number) Float64() (float64, error)
將該數(shù)字作為float64類型返回
func (n Number) String() string
返回該數(shù)字的字面值文本表示

10)type RawMessage []byte
RawMessage類型是一個保持原本編碼的json對象。本類型實現(xiàn)了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

實現(xiàn)了Marshaler接口的類型可以將自身序列化為合法的json描述岳颇。

12)type Unmarshaler interface

實現(xiàn)了Unmarshaler接口的對象可以將自身的json描述反序列化照捡。該方法可以認為輸入是合法的json字符串。如果要在方法返回后保存自身的json數(shù)據(jù)话侧,必須進行拷貝栗精。

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

HTMLEscape 函數(shù)將json編碼的src中的<、>瞻鹏、&悲立、U+2028和U+2029字符替換為\u003c、\u003e新博、\u0026薪夕、\u2028、\u2029轉義字符串赫悄,以便json編碼可以安全的嵌入HTML的<script>標簽里原献。因為歷史原因,網(wǎng)絡瀏覽器不支持<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函數(shù)將json編碼的調整縮進之后寫入dst。每一個json元素/數(shù)組都另起一行開始倔撞,以prefix為起始讲仰,一或多個indent縮進(數(shù)目看)

代碼案例

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創(chuàng)建一個從r讀取并解碼json對象的
Decoder误窖,解碼器有自己的緩沖叮盘,并可能超前讀取部分json數(shù)據(jù)。
2)func (dec *Decoder) UseNumber()
UseNumber方法將dec設置為當接收端是Interface{}接口時將json數(shù)字解碼為Number類型而不是float64類型霹俺。
3)func (dec *Decoder) Decode(v interface{}) error
Decode從輸入流讀取下一個json編碼值并保持在v指向的值里柔吼。

type Encoder struct
1)func NewEncoder(w io.Writer) Encoder
NewEncoder創(chuàng)建一個將數(shù)據(jù)寫入w的
Encoder。
2)func (enc *Encoder) Encode(v interface{}) error
Encode將v的json編碼寫入輸出流丙唧,并會寫入一個換行符愈魏。

三、開發(fā)中常用json操作
編碼:
1)func Marshal(v interface{}) ([]byte, error)

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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末想际,一起剝皮案震驚了整個濱河市培漏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胡本,老刑警劉巖牌柄,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侧甫,居然都是意外死亡珊佣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門披粟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咒锻,“玉大人,你說我怎么就攤上這事守屉』笸В” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵拇泛,是天一觀的道長滨巴。 經(jīng)常有香客問我,道長俺叭,這世上最難降的妖魔是什么兢卵? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮绪颖,結果婚禮上秽荤,老公的妹妹穿的比我還像新娘。我一直安慰自己柠横,他們只是感情好窃款,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牍氛,像睡著了一般晨继。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搬俊,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天紊扬,我揣著相機與錄音蜒茄,去河邊找鬼。 笑死餐屎,一個胖子當著我的面吹牛檀葛,可吹牛的內容都是我干的。 我是一名探鬼主播腹缩,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼屿聋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了藏鹊?” 一聲冷哼從身側響起润讥,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盘寡,沒想到半個月后楚殿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡竿痰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年勒魔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菇曲。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡冠绢,死狀恐怖,靈堂內的尸體忽然破棺而出常潮,到底是詐尸還是另有隱情弟胀,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布喊式,位于F島的核電站孵户,受9級特大地震影響,放射性物質發(fā)生泄漏岔留。R本人自食惡果不足惜夏哭,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望献联。 院中可真熱鬧竖配,春花似錦、人聲如沸里逆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽原押。三九已至胁镐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盯漂。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工颇玷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人就缆。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓帖渠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親违崇。 傳聞我的和親對象是個殘疾皇子阿弃,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內容