json序列化


基本介紹

json(JavaScript Object Notation) 是一種輕量級的數據交換格式,易於閱讀和編寫,同時也易於機器解析和生成 key-val
json 易於機器解析和生成,並有效的提升網絡傳輸效率,通常程序在網絡傳輸時,會先將數據(機構提,map等)序列化成json字符串,到接收方得到json字符串時,再反序列化回復成原來的數據類型(結構體,map等)

json格式

在js語言中,一切都是對象,因此,任何的數據類型都可以通過JSON來表示,例如字符串,數字,對象,數組,map,結構體等
JSON鍵值對是用來保存數據的一種方式,鍵值對組合中的鍵名寫在前面,並用"" 雙引號包裹,使用冒號: 分割,然后"值"

json序列化

結構體序列化

package main

import (
	"encoding/json"
	"fmt"
)

type Monster struct {
	Name string
	Age int
	Birthday string
	Sal float64
	Skill string
}
func main() {
	monster := Monster{
		Name : "牛魔王",
		Age : 500,
		Birthday : "0253-11-11",
		Sal : 8000.0,
		Skill : "牛魔拳",
	}
        // 序列化函數
	data,err := json.Marshal(&monster)
	if err != nil{
		fmt.Println("序列化錯誤",err)
	}
	fmt.Printf("monster序列化后的內容%v",string(data))
}

map序列化

package main

import (
	"encoding/json"
	"fmt"
)

type Monster struct {
	Name string
	Age int
	Birthday string
	Sal float64
	Skill string
}
func main() {
	var a map[string]interface{}
	// 使用map需要先make
	a = make(map[string]interface{})
	a["name"] = "紅孩兒"
	a["address"] = "火雲洞"

	// 將map進行序列化
	data,err := json.Marshal(a)
	if err != nil{
		fmt.Println("序列化失敗",err)
	}
	fmt.Println(string(data))
}

對切片序列化

package main

import (
	"encoding/json"
	"fmt"
)

type Monster struct {
	Name string
	Age int
	Birthday string
	Sal float64
	Skill string
}
func main() {
	// map切片
	var z float64 = 1.24
	var a []map[string]interface{}
	var m1 map[string]interface{}
	// 使用map需要先make
	m1 = make(map[string]interface{})
	m1["name"] = "紅孩兒"
	m1["address"] = [2]string{"火雲洞","背景"}
	a = append(a,m1)

	// 將map進行序列化
	data,err := json.Marshal(a)
	data2,err := json.Marshal(z)
	if err != nil{
		fmt.Println("序列化失敗",err)
	}
	fmt.Println(string(data))
	fmt.Printf("%v",string(data2))
}


基本數據類型 同理

json 序列化時對字段首字母大小寫的處理

序列化和反序列化時,鍵名的大小寫可能會發生沖突,用json 的tag 解決

package main

import (
	"encoding/json"
	"fmt"
)

type Monster struct {
	Name string `json:"name"`  // 反射機制
	Age int `json:"age"`
	Birthday string `json:"birthday"`
	Sal float64 `json:"sal"`
	Skill string `json:"skill"`
}
func main() {
	monster := Monster{
		Name:"牛魔王",
		Age:500,
		Birthday:"023-1-2",
		Sal:8000.0,
		Skill:"牛魔拳",
	}

	// 將map進行序列化
	data,err := json.Marshal(monster)
	if err != nil{
		fmt.Println("序列化失敗",err)
	}
	fmt.Println(string(data))
}

json的反序列化

package main

import (
	"encoding/json"
	"fmt"
)

type Monster struct {
	Name string `json:"name"`
	Age int `json:"age"`
	Birthday string `json:"birthday"`
	Sal float64 `json:"sal"`
	Skill string `json:"skill"`
}
func main() {
	monster := Monster{
		Name:"牛魔王",
		Age:500,
		Birthday:"023-1-2",
		Sal:8000.0,
		Skill:"牛魔拳",
	}
	// 將map進行序列化
	data,err := json.Marshal(monster)
	if err != nil{
		fmt.Println("序列化失敗",err)
	}
	dataStr := string(data)
	fmt.Println(dataStr)
        // 反序列化時,對於需要make的類型,內部源碼已經make過了
	err2 := json.Unmarshal([]byte(dataStr),&monster)
	if err2 != nil{
		fmt.Println("反序列化失敗",err2)
	}
	fmt.Println(monster)
}

細節

  1. 在反序列化一個JSON 字符串時,要確保反序列化之后的數據類型和原來序列化前的數據類型(里面的字段)保持一致


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM