Go语言编程基础:json

94 阅读2分钟
//JSON
json易于机器解析和生产,并有效地提升网络传输效率,通常程序在网络传输时
会先将数据(结构体,map,slice等)序列化成json字符串,接收方得到json
字符串时,再反序列化恢复成原来的数据。

在js中,一起都是对象。因此,任何数据类型都可以通过json表示。

JSON键值对是用来保存数据的一种方式
    {"firstName":"tom"}

json序列化:将有key-value结构的数据类型(结构体,map,slice等)序列化
成json字符串。

序列化
例1//结构体序列化
    type Monster struct {
	Name string
	Age  int
	Birthday string
	Sal   float64
	Skill string
    }

    func testStruct() {
	monster := Monster{
		Name: "Tom",
		Age: 500,
		Birthday: "2011-11-11",
		Sal: 800.0,
		Skill: "say hello",
	}

	data, err := json.Marshal(&monster)
	if err != nil {
		fmt.Printf("wrong! err = %v \n", err)
	}

	fmt.Printf("monster = %v \n", string(data))
    }



例2//将 map 进行序列化
    func testMap() {
    
            //定义一个 map
            var a map[string]interface{}

            //使用 map,需要 make
            a = make(map[string]interface{})
            a["name"] = "红孩儿"
            a["age"] = 30
            a["address"] = "洪崖洞"
            //将 a 这个 map 进行序列化

            //将 monster 序列化
            data, err := json.Marshal(a)
            if err != nil {
                fmt.Printf("序列化错误 err=%v\n", err)
            }

            //输出序列化后的结果
            fmt.Printf("a map 序列化后=%v\n", string(data))

        }
        
 例3//slice序列化
     func testSlice() {
         var slice []map[string]interface{}
         var m1 map[string]interface{}

         //使用 map 前,需要先 make
         m1 = make(map[string]interface{})
         m1["name"] = "jack"
         m1["age"] = "7"
         m1["address"] = "北京"

         slice = append(slice, m1)

         var m2 map[string]interface{}

         //使用 map 前,需要先 make
         m2 = make(map[string]interface{})
         m2["name"] = "tom"
         m2["age"] = "20"
         m2["address"] = [2]string{"墨西哥","夏威夷"}

         slice = append(slice, m2)

         //将切片进行序列化操作
         data, err := json.Marshal(slice)
         if err != nil {
             fmt.Printf("序列化错误 err=%v\n", err)

         }

         //输出序列化后的结果
         fmt.Printf("slice 序列化后=%v\n", string(data))

     }
     
反序列化
例1:
    package main

    import (

        "fmt"

        "encoding/json"

    )

    //定义一个结构体

    type Monster struct {
        Name string
        Age int
        Birthday string //....
        Sal float64
        Skill string

    }

    //演示将 json 字符串,反序列化成 struct

    func unmarshalStruct() {

        //说明 str 在项目开发中,是通过网络传输获取到.. 或者是读取文件获取到
        str := "{\"Name\":\"牛魔王\",\"Age\":500,\"Birthday\":\"2011-11-11\",\"Sal\":8000,\"Skill\":\"牛魔拳\"}"

        //定义一个 Monster 实例
        var monster Monster
        err := json.Unmarshal([]byte(str), &monster)

        if err != nil {
            fmt.Printf("unmarshal err=%v\n", err)

        }

        fmt.Printf("反序列化后 monster=%v monster.Name=%v \n", monster, monster.Name)

}