Go语言自学系列 | golang标准库encoding/json

视频来源:B站《golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中...]》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:Go语言自学系列 | 汇总_COCOgsta的博客-CSDN博客_go语言自学


这个包可以实现json的编码和解码,就是将json字符串转换为struct,或者将struct转换为json。

核心的两个函数

func Marshal(v interface{}) ([]byte, error)

将struct编码成json,可以接收任意类型

func Unmarshal(data []byte, v interface{}) error

将json转码为struct结构体

两个核心结构体

type Decoder struct {
    // contains filtered or unexported fields
}

从输入流读取并解析json

type Encoder struct {
    // contains filtered or unexported fields
}

写json到输出流

实例演示

结构体转换为json

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name  string
    Age   int
    Email string
}

func Marshal() {
    p := Person{
        Name:  "tom",
        Age:   20,
        Email: "tom@gmail.com",
    }
    b, _ := json.Marshal(p)
    fmt.Printf("b: %v\n", string(b))
}

func main() {
    Marshal()
}

运行结果

[Running] go run "/Users/guoliang/Documents/Source Code/go/test.go"
b: {"Name":"tom","Age":20,"Email":"tom@gmail.com"}

json转换为结构体

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name  string
    Age   int
    Email string
}

func Unmarshal() {
    b1 := []byte(`{"Name":"tom","Age":20,"Email":"tom@gmail.com"}`)
    var m Person
    json.Unmarshal(b1, &m)
    fmt.Printf("m: %v\n", m)
}

func main() {
    Unmarshal()
}

运行结果

[Running] go run "/Users/guoliang/Documents/Source Code/go/test.go"
m: {tom 20 tom@gmail.com}

解析嵌套类型

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name  string
    Age   int
    Email string
}

func test3() {
    b := []byte(`{"Name":"tom","Age":20,"Email":"tom@gmail.com","Parents":["big tom","kite"]}`)
    var f interface{}
    json.Unmarshal(b, &f)
    fmt.Printf("f: %v\n", f)
}

func main() {
    test3()
}

运行结果

[Running] go run "/Users/guoliang/Documents/Source Code/go/test.go"
f: map[Age:20 Email:tom@gmail.com Name:tom Parents:[big tom kite]]

解析嵌套引用类型

package main

import (
    "encoding/json"
    "fmt"
)

func test4() {
    type Person struct {
        Name  string
        Age   int
        Email string
        Parent []string
    }

    p := Person{
        Name: "tom",
        Age: 20,
        Email: "tom@gmail.com",
        Parent: []string{"big tom", "big kite"},
    }

    b, _ := json.Marshal(p)
    fmt.Printf("b: %v\n", string(b))
}

func main() {
    test4()
}

运行结果

[Running] go run "/Users/guoliang/Documents/Source Code/go/test.go"
b: {"Name":"tom","Age":20,"Email":"tom@gmail.com","Parent":["big tom","big kite"]}

io流Reader Writer可以扩展到http websocket等场景

package main

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

func test5() {
    // dec := json.NewDecoder(os.Stdin)
    // a.json : {"Name":"tom","Age":20,"Email":"tom@gmail.com","Parents":["tom","kite"]}
    f, _ := os.Open("a.json")
    dec := json.NewDecoder(f)
    enc := json.NewEncoder(os.Stdout)
    for {
        var v map[string]interface{}
        if err := dec.Decode(&v); err != nil {
            log.Println(err)
            return
        }
        fmt.Printf("v: %v\n", v)
        if err := enc.Encode(&v); err != nil {
            log.Println(err)
        }

    }
}

func main() {
    test5()
}

运行结果

[Running] go run "/Users/guoliang/Documents/Source Code/go/test.go"
v: map[Age:20 Email:tom@gmail.com Name:tom Parents:[tom kite]]
{"Age":20,"Email":"tom@gmail.com","Name":"tom","Parents":["tom","kite"]}
2022/06/16 22:51:41 EOF

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:Age of Ai 设计师:meimeiellie 返回首页
评论

打赏作者

COCOgsta

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值