美文网首页go语言Go知识库
golang标准库中的encoding/json包

golang标准库中的encoding/json包

作者: ljh123 | 来源:发表于2018-12-12 19:19 被阅读0次

    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

    相关文章

      网友评论

        本文标题:golang标准库中的encoding/json包

        本文链接:https://www.haomeiwen.com/subject/espphqtx.html