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