zoukankan      html  css  js  c++  java
  • Golang-Json序列化和反序列化

    json 的序列化介绍
        json 序列化是指,将有 key-value 结构的数据类型(比如结构体、map、切片)序列化成 json 字符串的操作。
    应用案例
        这里我们介绍一下结构体、map 和切片的序列化,其它数据类型的序列化类似。
    package main 
    import (
    	"fmt"
    	"encoding/json"
    )
    	
    //定义一个结构体
    type Monster struct {
    	Name string 
    	Age int 
    	Birthday string 
    	Sal float64 
    	Skill string
    }
    	
    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
    ", err)
    	}
    	//输出序列化后的结果
    	fmt.Printf("monster 序列化后=%v
    ", string(data))
    	
    }
    //将 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
    ", err)
    	}
    	//输出序列化后的结果
    	fmt.Printf("a map  序列化后=%v
    ", string(data))
    
    }
    //演示对切片进行序列化, 我们这个切片 []map[string]interface{} 
    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
    ", err)
    	}
    	//输出序列化后的结果
    	fmt.Printf("slice 序列化后=%v
    ", string(data))
    
    }
    //对基本数据类型序列化,对基本数据类型进行序列化意义不大
    func testFloat64() {
    	var num1 float64 = 2345.67
    
    	//对 num1 进行序列化
    	data, err := json.Marshal(num1) 
    	if err != nil {
    		fmt.Printf("序列化错误 err=%v
    ", err)
    	}
    	//输出序列化后的结果
    	fmt.Printf("num1 序列化后=%v
    ", string(data))
    }
    
    func main() {
    	//演示将结构体, map , 切片进行序列号
    	testStruct() testMap()
    	testSlice()//演示对切片的序列化
    	testFloat64()//演示对基本数据类型的序列化
    }
    	
    

    注意事项
      对于结构体的序列化,如果我们希望序列化后的key 的名字,又我们自己重新制定,那么可以给struct指定一个 tag 标签.
      

      序列化后:
      {"monster_name":"牛魔王","monster_age":500,"Birthday":"2011-11-11","Sal":8000,"Skill":"牛魔拳"}

    json 的反序列化基本介绍

      json 反序列化是指,将 json 字符串反序列化成对应的数据类型(比如结构体、map、切片)的操作
      应用案例
      这里我们介绍一下将 json 字符串反序列化成结构体、map 和切片代码演示:

    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
    ", err)
    	}
    	fmt.Printf("反序列化后 monster=%v monster.Name=%v 
    ", monster, monster.Name)
    	
    }
    //演示将 json 字符串,反序列化成 map
    func unmarshalMap() {
    	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
    ", err)
    	}
    	fmt.Printf("反序列化后 a=%v
    ", a)
    	
    }
    //演示将 json 字符串,反序列化成切片
    func unmarshalSlice() {
    	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
    ", err)
    	}
    	fmt.Printf("反序列化后 slice=%v
    ", slice)
    }
    	
    func main() {
    	
    	unmarshalStruct() 
    	unmarshalMap() 
    	unmarshalSlice()
    }

      对上面代码的小结说明
      1)在反序列化一个json 字符串时,要确保反序列化后的数据类型和原来序列化前的数据类型一致。

  • 相关阅读:
    Python解释器相关知识
    简单了解下Flask
    Scoket编程
    __file__的作用
    jquery编写可折叠列表
    浑浑噩噩的一天
    js实现杨辉三角
    js闭包
    python读取word表格
    HTMLTestRunner报告
  • 原文地址:https://www.cnblogs.com/Essaycode/p/12692797.html
Copyright © 2011-2022 走看看