Golang 与 JSON(JavaScript Object Notation)

JSON简介

json是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它是目前主流的数据格式之一

json是易于机器解析和生成,并有效地提升网络传输效率,通常程序在网络传输时会先将数据(结构体、map等)序列化成json字符串,到接收方得到json字符串时,在反序列化恢复成原来的数据类型(结构体、map等)。这种方式已然成为各个语言的标准

尚硅谷Go语言课程

关于json语言的详细描述,网上可找的学习资料有很多,这里就不再多说,总之就是key-value的形式

JSON序列化

下面主要介绍 结构体, map和切片的序列化,其它数据类型的序列化类似

实例,将结构体类型,map类型和slice切片类型进行序列化,也就是转化为json字符串

package main

import (
    "encoding/json"
    "fmt"
)

type student struct {
    name string
    age  int
    sex  string
}

func jsonStruct() {
    stu := student{
        name: "Zideng Feng",
        age:  22,
        sex:  "Male",
    }
    json, err := json.Marshal(&stu)
    if err != nil {
        fmt.Println("Serialize failed")
    } else {
        fmt.Println(string(json))
    }
}

func jsonMap() {
    var mapping map[string]int
    mapping = make(map[string]int)
    mapping["fzd"] = 22
    mapping["zyq"] = 23
    mapping["lyc"] = 24
    json, err := json.Marshal(mapping)
    if err != nil {
        fmt.Println("Serialize failed")
    } else {
        fmt.Println(string(json))
    }
}

func jsonSlice() {
    var slice = []string{"fzd", "zyq", "lyc"}
    json, err := json.Marshal(slice)
    if err != nil {
        fmt.Println("Serialize failed")
    } else {
        fmt.Println(string(json))
    }
}

func main() {
    jsonStruct()
    jsonMap()
    jsonSlice()
}

输出的结果是:

{}
{"fzd":22,"lyc":24,"zyq":23}
["fzd","zyq","lyc"]

我们可以发现第一个是空的,为啥呢?因为json.Marshal()是其它包中的函数。我们再来看我们的结构体,其中的属性首字母没有大写,呵呵,怪不得调用不了,于是更改如下:

type student struct {
    Name string
    Age  int
    Sex  string
}

输出的结果是:

{"Name":"Zideng Feng","Age":22,"Sex":"Male"}
{"fzd":22,"lyc":24,"zyq":23}
["fzd","zyq","lyc"]

这其实还不够好,应该再结构体中添加反射机制

type student struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    Sex  string `json:"sex"`
}

这样输出的结果就是

{"name":"Zideng Feng","age":22,"sex":"Male"}
{"fzd":22,"lyc":24,"zyq":23}
["fzd","zyq","lyc"]

JSON的反序列化

介绍

json反序列化是指将json字符串反序列化成对应的数据类型(比如结构体、map、切片)等操作

下面的案例我们也将介绍将json字符串反序列化成结构体、map和切片

package main

import (
    "encoding/json"
    "fmt"
)

type student struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    Sex  string `json:"sex"`
}

func Struct() {
    jsonString := "{\"name\":\"Zideng Feng\",\"age\":22,\"sex\":\"Male\"}"
    var stu student
    err := json.Unmarshal([]byte(jsonString), &stu)
    if err != nil {
        fmt.Println("Serialize failed")
    } else {
        fmt.Println(stu)
    }
}

func Map() {
    jsonString := "{\"fzd\":22,\"lyc\":24,\"zyq\":23}"
    var mapping map[string]int
    err := json.Unmarshal([]byte(jsonString), &mapping)
    if err != nil {
        fmt.Println("Serialize failed")
    } else {
        fmt.Println(mapping)
    }
}

func Slice() {
    jsonString := "[\"fzd\",\"zyq\",\"lyc\"]"
    var slice []string
    err := json.Unmarshal([]byte(jsonString), &slice)
    if err != nil {
        fmt.Println("Serialize failed")
    } else {
        fmt.Println(slice)
    }
}

func main() {
    Struct()
    Map()
    Slice()
}

也比较简单,调用Unmarshal即可,第一个参数就是将string类型变成byte切片,第二个参数就是将要赋值的变量的指针类型

输出的结果是:

{Zideng Feng 22 Male}
map[fzd:22 lyc:24 zyq:23]
[fzd zyq lyc]