ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JSON

2021-05-10 20:57:54  阅读:158  来源: 互联网

标签:map string err fmt json JSON 序列化


json

1、json 基本介绍

JSON( JavaScript Object Notation) 是一种轻量级别的数据交换格式。易于阅读与编写,同时也易于机器解析和生成。key-val

JSON 易于机器解析和生成,并有效地提升网络传输效率,通常程序在网络传输时会先将数据(结构体、map等)序列化 成 json 字符串,接收方得到 json 字符串时,在 反序列化 恢复成原来的数据类型(结构体、map等)。这种方式已然成为各个语言的标准。

1)格式说明

在 JS 语言中,一切都是对象。因此,任何数据类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组、map、结构体等。

JSON 键值对是用来保存数据一种方式 ,任何数据类型都可以转成 json 格式。
键/值对组合的键名写在前面并且用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值;

[{"key1": val1, "key2": val2, "key3": val3, "key4": [val4, val5]},
{"key1": val1, "key2": val2, "key3": val3, "key4": [val4, val5]}]
// 例
{"firstName" : "Json"}
{"name" : "tom", "age" : 18, "address" : ["北京", "上海"]}
{"name" : "tom", "age" : 18, "address" : ["北京", "上海"],
{"name" : "Bob", "age" : 33, "address" : ["广州", "深圳"]}}

2)json 数据在线解析

https://www.json.cn/ 网站可以验证一个 json 格式的数据是否正确。

2、json 的序列化

json 的序列化 是指将有 key-value 结构的数据类型(比如结构体、map、切片)序列化转化成 json 字符串的操作。

代码

1)将结构体序列化

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: "11-11",
		Sal : 9999.9,
		Skill : "火眼金睛",
	}
	
	// 将 monster 序列化
	data, err := json.Marshal(&monster)
	if err != nil {
		fmt.Printf("序列号错误:%v\n", err)
	}
	// 输入序列化后的结果
	fmt.Printf("monster 序列化后:%v\n", string(data))
	fmt.Printf("monster 序列化后:%v\n", data)
}

func main() {
	testStruct()
}

2)将 map 序列化

package main

import (
	"fmt"
	"encoding/json"
)
// 定义一个结构体
type Monster struct {
	Name string
	Age int
	Birthday string
	Sal float64
	Skill string
}

func testMap() {
	// 定义一个 map
	var a map[string]interface{}
	// 使用 map, 需要 make
	a = make(map[string]interface{})
	a["name"] = "红孩儿"
	a["age"] = 33
	a["address"] = "火焰山"
	// 将 a 这个 map 进行序列化
	// 将 monster 序列化
	data, err := json.Marshal(a)
	if err != nil {
		fmt.Printf("序列号错误:%v\n", err)
	}
	// 输入序列化后的结果
	fmt.Printf("a map 序列化后:%v\n", string(data))
	fmt.Printf("a map 序列化后:%v\n", data)
}

func main() {
	testMap()
}

3)将切片序列化

package main

import (
	"fmt"
	"encoding/json"
)
// 定义一个结构体
type Monster struct {
	Name string
	Age int
	Birthday string
	Sal float64
	Skill string
}

func testSlice() {
	var slice []map[string]interface{}
	var ml map[string]interface{}
	// 使用 map 前,需要先 make
	ml = 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"] = "Bob"
	m2["age"] = "9"
	m2["address"] = "深圳"
	slice = append(slice, m2)
	
	// 将切片序列化操作
	data, err := json.Marshal(slice)
	if err != nil {
		fmt.Printf("序列号错误:%v\n", err)
	}
	// 输出序列化后的结果
	fmt.Printf("slice 序列化后:%v\n", string(data))
}

func main() {
	testSlice()
}

4)将基本数据序列化

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

5)注意事项

对于结构体的序列化,如果我们希望序列化后的 key 的名字,由我们自己重新定义,那么我们可以给 struct 制定一个 tag 标签:

type Monster struct {
	Name string `json:"monster_name"`
	Age int`json:"monster_age"`
	Birthday string
	Sal float64
	Skill string
}

3、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\\n", err)
	}
	fmt.Printf("反序列化后 monster = %v monster.Name = %v \n", 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\n", err)
	}
	fmt.Printf("反序列化后 a = %v\n", a)
}

// 演示将json 字符串,反序列化成为切片
func unmarshalSlice() {
	str := "[{\"address\" : \"北京\",\"age\" : \"23\", \"name\" : \"jack\"}," + "{\"address\" : [\"夏威夷\", \"墨西哥\"],\"age\" : \"21\", \"name\" : \"Bob\"}]"
	// 定义一个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)
}

func main() {
	unmarshalStruct()
	unmarshalMap()
	unmarshalSlice()
}

小结

① 在反序列化一个 json 字符串时,要确保反序列化后的数据类型和序列化前的数据类型一致;
② 如果 json 字符串是通过程序获取到的,则不需要再对 " 转义处理。

func unmarshalMap() {
	// str := "{\"address\" : \"洪崖洞\", \"age\" : 30, \"name\" : \"红孩儿\"}"
	str := testMap()
}

标签:map,string,err,fmt,json,JSON,序列化
来源: https://blog.csdn.net/oncewawa/article/details/116588628

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有