go语言开发基础36 - 之go语言里的json序列化使用

作为先天具有高并发的go语言,经常用于网络传输,go语言为我们提供了json的数据封装,

便于数据的交换和解析。下面来看看go语言中的json使用。代码最为明显。

JSON(JavaScript Object Notation) 是一种轻量级的数据传输格式。类似于XML,传输效率高,易于人阅读和编写。同时也易于机器解析和生成。

 

一、json使用实例

1.1、json序列化和反序列化结构体类型数据

package main

import (
    "fmt"
    "encoding/json"      // 导入json包
)

// 自定义结构体类型
type User struct {
    UserName string `json:"username"`
    NickName string `json:"nickname"`
    Age int
    Birthday string
    Sex string
    Email string
}

func structJson() {
    // 定义结构体类型变量并初始化
    user1 := &User {
        UserName: "Dream Person", 
        NickName: "Dream", 
        Birthday: "2008/8/8",
        Age: 18,
        Sex: "",
        Email: "zmr@dream.com",
    }
    // 定义结构体类型变量
    var userResult User
    // 使用json序列化user1变量(返回一个byte类型的列表和错误信息)
    data, err := json.Marshal(user1)
    // 判断序列化是否有错误
    if err != nil {
        fmt.Println("json.Marshal err:",err)
    }
    // 打印序列化后的结果(序列化后是byte类型,需要转化为字符串类型)
    fmt.Printf("序列化后的结果为:%s,类型为:%T\n",string(data),data)     // 结果为:序列化后的结果为:{"username":"Dream Person","nickname":"Dream","Age":18,"Birthday":"2008/8/8","Sex":"男","Email":"zmr@dream.com"},类型为:[]uint8
    // json反序列化,接收的变量一定要传地址,否则无法将反序列化后的结果存到变量里(传值只会修改变量的副本)
    json.Unmarshal(data, &userResult)
    fmt.Println("反序列化后的结果为:", userResult)       // 结果为:{Dream Person Dream 18 2008/8/8 男 zmr@dream.com}
}

 

1.2、json序列化和反序列化map类型的数据

package main

import (
    "fmt"
    "encoding/json"      // 导入json包
)

// map序列化
func mapJson() {
    var m map[string]interface{}       // 定义map变量
    var mResult map[string]interface{}
    mResult = make(map[string]interface{})
    m = make(map[string]interface{})    // 初始化
    m["username"] = "user1"        // 赋值
    m["age"] = 19
    m["sex"] = ""

    data, err := json.Marshal(m)            // 序列化
    if err != nil {          // 错误判断
        fmt.Println("json.Marshal err:",err)
        return
    }
    fmt.Printf("序列化后结果为:%s\n",string(data))      // 结果为:序列化后结果为:{"age":19,"sex":"男","username":"user1"}
    // json反序列化,接收的变量一定要穿内存地址,否则无法将反序列化的值存到变量里(传值会修改变量的副本,所以一定要传内存地址)
    json.Unmarshal(data, &mResult)
    fmt.Println("反序列化的结果为:", mResult)       // 结果为:反序列化的结果为: map[age:19 sex:男 username:user1]
}

 

1.3、json序列化和反序列化切片类型的数据

package main

import (
    "fmt"
    "encoding/json"      // 导入json包
)

// 序列化切片
func sliceJson() {
    var m map[string]interface{}
    var s []map[string]interface{}
    m = make(map[string]interface{})
    var sResult []map[string]interface{}
    m["username"] = "user1"
    m["age"] = 19
    m["sex"] = "man"

    s = append(s,m)

    m = make(map[string]interface{})
    m["username"] = "user2"
    m["age"] = 20
    m["sex"] = "feman"

    s = append(s,m)

    data, err := json.Marshal(s)
    if err != nil {
        fmt.Println("json.Marshal err:",err)
    }
    fmt.Printf("序列化后结果为:%s\n",string(data))     // 结果为:序列化后结果为:[{"age":19,"sex":"man","username":"user1"},{"age":20,"sex":"feman","username":"user2"}]
    // json反序列化,接收反序列化结果的变量一定要传内存地址,传值无法将反序列化后的结果存到变量里
    json.Unmarshal(data, &sResult)
    fmt.Println("反序列化后结果为:", sResult)        // 结果为:反序列化后结果为: [map[age:19 sex:man username:user1] map[age:20 sex:feman username:user2]]
}

 

posted @ 2020-07-30 14:40  欧-阳  阅读(256)  评论(0)    收藏  举报