JSON基础学习

json的基本介绍

概述

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
JSON是在2001年开始推广使用的数据格式,目前已经成为主流的数据格式。
JSON易于机器解析和生成,并有效地提升网络传输效率,通常程序在网络传输时会先将数据结构体、map等)序列化ison字符串,到接收方得到json字符串时,在反序列化恢复成原来的数据类型(结构体、map等)。这种方式已然成为各个语言的标准。

json数据格式说明(扩展性好,灵活)

在JS语言中,一切都是对像。因此,任何数据类型都可以通过JSON来表示,例如字符串、数字、对象、数组,map,结构体等
任何数据类型都可以转成json格式
JSON键值对是用来保存数据一种方式,键/值对组合中的键名写在前面并用双引号"”包裹,使用冒号:分隔,然后紧接着值:
比如:
{“firstName”:“Json”}
比如:
{“name”:“tom”,“age”:18,“address’”:[“北京”,“上海”]}
比如:
[{“name”:“tom”,“age”:18,“address”[“北京”,“上海”]},
{“name”:“mary”,“age”:28,“address’”:[“广州”,“深圳”]}]

json数据在线解析

https://www.json.cn/网站可以验证一个json格式的数据是否正确。尤其是在我们编写比较复杂的json格式数据时,很有用。
在这里插入图片描述
在这里插入图片描述

json的序列化

介绍

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

结构体、map、切片的序列化

package main

import (
	"encoding/json"
	"fmt"
)

type Monster struct {
	Name     string
	Age      int
	Birthday string
	Sal      float64
	Skills   string
}

func testStruct() {
	monster := Monster{
		Name:     "牛魔王",
		Age:      500,
		Birthday: "2011-11-11",
		Sal:      8000.0,
		Skills:   "拳法",
	}
	data, err := json.Marshal(&monster)
	if err != nil {
		fmt.Printf("序列化错误 err=%v\n", err)
	}
	fmt.Printf("monster序列化后 = %v\n", string(data))
}

// 将map进行序列化
func testMap() {
	var a map[string]interface{}
	//使用map前,需要make
	a = make(map[string]interface{})
	a["name"] = "swk"
	a["age"] = 30
	a["address"] = "hongyadong"
	//将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))
}

// 对切片进行序列化
func testSlice() {
	var slice []map[string]interface{}
	var m1 map[string]interface{}
	m1 = make(map[string]interface{})
	m1["name"] = "jack"
	m1["age"] = 23
	m1["address"] = "localhost"
	slice = append(slice, m1)
	var m2 map[string]interface{}
	m2 = make(map[string]interface{})
	m2["name"] = "tom"
	m2["age"] = 23
	m2["address"] = [2]string{"北京"."上海"}
	slice = append(slice, m2)
	//将切片机芯给序列化操作
	data, err := json.Marshal(slice)
	if err != nil {
		fmt.Printf("序列化错误 err=%v\n", err)
	}
	fmt.Printf("切片 序列化后=%v\n", string(data))

}

// 对基本数据类型序列化
func testFloat64() {
	var num1 float64 = 2345.54
	data, err := json.Marshal(num1)
	if err != nil {
		fmt.Printf("序列化错误 err=%v\n", err)
	}
	fmt.Printf("基本数据类型序列化后=%v\n", string(data))

}
func main() {
	//演示将结构体,map、切片进行序列化
	testStruct()
	testMap()
	testSlice()
	testFloat64()
}

  • 注意事项
    对于结构体的序列化,如果我们希望序列化后的key的名字,由我们自己重新指定,那么可以给struct指定一个tag标签。
type Monster struct {
	Name     string `json:"monster_name"`
	Age      int    `json:"monster_age"`
	Birthday string
	Sal      float64
	Skills   string
}

json的反序列化

介绍

json的反序列化是指,将json字符串反序列化成对应的数据类型(比如结构体、map、切片)的操作。

结构体、map、切片的反序列化

package main

import (
	"encoding/json"
	"fmt"
)

// 定义一个结构体
type Monster struct {
	Name     string
	Age      int
	Birthday string
	Sal      float64
	Skill    string
}

// 将json字符串,反序列化成struct
func unmarshalStruct() {
	str := "{\"name\":\"牛魔王\",\"Age\":500,\"Birthday\":\"2011-11-11\",\"sal\":8000,\"skill\":\"牛魔拳\"}"
	var monster Monster
	err := json.Unmarshal([]byte(str), &monster)
	if err != nil {
		fmt.Printf("unmarshal err = %v\n", err)
	}
	fmt.Printf("反序列化 monster=%v", monster)
}

// 演示将json字符串,反序列化成map
func unmarshalMap() {
	str := "{\"name\":\"牛魔王\",\"Age\":500,\"Birthday\":\"2011-11-11\",\"sal\":8000,\"skill\":\"牛魔拳\"}"
	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\":\"localhost\",\"age\":23,\"name\":\"jack\"}," +
		"{\"address\":\"localh\nost\",\"age\":23,\"name\":\"tom\"}]"
	//定义一个切片
	var slice []map[string]interface{}
	//反序列化
	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()
}

  • 对上述代码的小结说明
  1. 在反序列化一个json字符串时,要确保反序列化后的数据类型嗯好原来序列化前的数据类型一致。
  2. 如果json字符串是通过程序获取到的,则不需要对“”进行转义处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值