[GO language foundation] JSON serialization and deserialization (14)

JSON

JSON (JavaScript Object Notation, JS Object Notation) is a lightweight data exchange format. https://www.json.cn/

  • Grammar rules
    In the JS language, everything is an object. Therefore, any supported type can be represented by JSON.
  • Key/value pair
    JSON key-value pair is a way to save JS objects. The key name in the key/value pair combination is written in front and wrapped in double quotation marks "", separated by a colon:, and then followed by the value
    {"firstName": "Json"}
  • Serialization of
    json JSON serialization refers to the operation of serializing data types with a key-value structure (such as structure, map, and slice) into json strings.
  1. Structure json serialization:
    type Monster struct {
        Name string
        Age int
        Birthday string
        Sal float64
        Skill string
    }

    func main() {
        monster := Monster{
            Name :"牛魔王",
            Age : 500 ,
            Birthday : "2011-11-11",
            Sal : 8000.0,
            Skill : "牛魔拳",
        }

        //将monster 序列化
        data, err := json.Marshal(&monster) //..
        if err != nil {
            fmt.Printf("序列号错误 err=%v\n", err)
        }
        //输出序列化后的结果
        fmt.Printf("monster序列化后=%v\n", string(data))
    }
  1. map json serialization:
    func main() {
        //定义一个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))
    }
  1. Slice json serialization:
    func main() {
        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. Basic data type serialization

Serialization of basic data types does not make much sense

    func main() {
        var num1 float64 = 2345.67

        //对num1进行序列化
        data, err := json.Marshal(num1)
        if err != nil {
            fmt.Printf("序列化错误 err=%v\n", err)
        }
        //输出序列化后的结果
        fmt.Printf("num1 序列化后=%v\n", string(data))
    }

Note
For the serialization of the structure, if we want the name of the serialized key to be redesigned by ourselves, then we can assign a tag tag to the struct.

type Monster struct {
	Name string `json:"monster_name"` //反射机制
	Age int `json:"monster_age"`
	Birthday string `json:"monster_birthday"`
	Sal float64 `json:"monster_sal"`
	Skill string `json:"monster_skill"`
}

func testStruct() {
	//演示
	monster := Monster{
		Name :"牛魔王",
		Age : 500 ,
		Birthday : "2011-11-11",
		Sal : 8000.0,
		Skill : "牛魔拳",
	}

	//将monster 序列化
	data, err := json.Marshal(&monster) //..
	if err != nil {
		fmt.Printf("序列号错误 err=%v\n", err)
	}
	//输出序列化后的结果
	fmt.Printf("monster序列化后=%v\n", string(data))

}
  • json deserialization
    json deserialization refers to the operation of deserializing json strings into corresponding data types (such as structure, map, slice)
  1. json deserialization structure:
    type Monster struct {
        Name string  
        Age int 
        Birthday string //....
        Sal float64
        Skill string
    }

    //演示将json字符串,反序列化成struct
    func main() {
        //说明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)
    }
  1. json deserialize map:
func main() {
	str := "{\"address\":\"洪崖洞\",\"age\":30,\"name\":\"红孩儿\"}"
	//定义一个map
	var a map[string]interface{} 

	//反序列化
	//注意:反序列化map,不需要make,因为make操作被封装到 Unmarshal函数
	err := json.Unmarshal([]byte(str), &a)
	if err != nil {
		fmt.Printf("unmarshal err=%v\n", err)
	}
	fmt.Printf("反序列化后 a=%v\n", a)

}
  1. json deserialize slice:
    func main() {
        str := "[{\"address\":\"北京\",\"age\":\"7\",\"name\":\"jack\"}," + 
            "{\"address\":[\"墨西哥\",\"夏威夷\"],\"age\":\"20\",\"name\":\"tom\"}]"
        
        //定义一个slice
        var slice []map[string]interface{}
        //反序列化,不需要make,因为make操作被封装到 Unmarshal函数
        err := json.Unmarshal([]byte(str), &slice)
        if err != nil {
            fmt.Printf("unmarshal err=%v\n", err)
        }
        fmt.Printf("反序列化后 slice=%v\n", slice)
    }

Guess you like

Origin blog.csdn.net/weixin_54707168/article/details/114006099