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