(三十八)golang--json(对切片、map、结构体进行序列化)

时间:2022-07-23
本文章向大家介绍(三十八)golang--json(对切片、map、结构体进行序列化),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

JSON(javascript object notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。key-val

JSON是在2001年开始推广的数据格式,目前已成为主流的数据格式。

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

要解析成json格式,struct里面的字段必须大写!!!不然解析出来的是{}

因为Json包相当于一个外包,字段大写才能被其调用。。。

package main

import (
    "encoding/json"
    "fmt"
)

type monster struct {
    Name     string
    Age      int
    Birthday string
    Sal      float64
    Skill    string
}

func testStruct() {
    m := monster{
        Name:     "牛魔王",
        Age:      10,
        Birthday: "1994-09-18",
        Sal:      10000.0,
        Skill:    "牛魔拳",
    }
    //序列化
    data, err := json.Marshal(&m)
    if err != nil {
        fmt.Println("序列化失败,error=", err)
    }
    fmt.Printf("序列化之后的结果:%vn", string(data))
}

func testMap() {
    var a map[string]interface{}
    a = make(map[string]interface{})
    a["name"] = "孙悟空"
    a["age"] = 20
    a["address"] = "水帘洞"
    a["skill"] = "七十二变"
    data, err := json.Marshal(a)
    if err != nil {
        fmt.Println("序列化失败,error=", err)
    }
    fmt.Printf("序列化之后的结果:%vn", string(data))
}

func testSlice() {
    var slice []map[string]interface{}
    var m1 map[string]interface{}

    m1 = make(map[string]interface{})
    m1["name"] = "孙悟空"
    m1["age"] = 20
    m1["address"] = "水帘洞"
    m1["skill"] = [2]string{"七十二变", "如意金箍棒"}
    slice = append(slice, m1)
    var m2 map[string]interface{}

    m2 = make(map[string]interface{})
    m2["name"] = "猪八戒"
    m2["age"] = 30
    slice = append(slice, m2)
    data, err := json.Marshal(slice)
    if err != nil {
        fmt.Println("序列化失败,error=", err)
    }
    fmt.Printf("序列化之后的结果:%vn", string(data))
}

func testFloat64() {
    var a float64
    a = 0.987
    data, err := json.Marshal(a)
    if err != nil {
        fmt.Println("序列化失败,error=", err)
    }
    fmt.Printf("序列化之后的结果:%vn", string(data))
}

func main() {
    testStruct()
    testMap()
    testSlice()
    testFloat64()
}

要想序列化成小写的,只需要用tag指定即可:

对普通数据类型进行序列化是没意义的,只是相当于转换成string类型。