9.3 Go json
9.3 Go json
json是一种轻量级的数据交换格式,易于机器解析,是种key-value格式。
JavaScript Object Notation是中种主流的数据格式。
json常用于网络传输
先将程序数据(如map、struct等)序列化成json字符串
接收方得到json字符串时,进行反序列化成原有数据类型

JS语言中,任何数据类型都可以通过JSON表示,如字符串、数字、对象、数组、map、结构体等。
JSON用键值对保存数据
1.1. 在线解析json网址
1.2. json序列化
序列化是指将key-value结构的数据类型如struct、map、切片序列化成json字符串。
实例
package main import (
"encoding/json"
"fmt"
) //自定制序列化后,json字符串的key名,可以用struct的tag标签
type Student struct {
Name string `json:"姓名"`
Age int `json:"年纪"`
Score float64 `json:"成绩"`
} //序列化结构体
func testStruct() {
stu := Student{
"老王",
19,
99.9,
}
//序列化结构体
data, err := json.Marshal(&stu)
if err != nil {
fmt.Printf("序列化出错,", err)
}
//data是数组切片,需要类型强转
fmt.Printf("序列化结果:%v\n", string(data))
} //序列化map
func testMap() {
mymap := make(map[string]string)
mymap["名字"] = "银角大王"
mymap["年纪"] = "三十六"
mymap["住址"] = "沙河"
//对map序列化
data, err := json.Marshal(mymap)
if err != nil {
fmt.Printf("序列化出错:%v\n", err)
}
fmt.Println("序列化结果:", string(data))
} //序列化切片
func testSlice() {
//定义切片
var s1 []map[string]interface{} var m1 map[string]interface{} //对map初始化
m1 = make(map[string]interface{})
m1["名字"] = "牛魔狗"
m1["年纪"] = 11
m1["地址"] = "流沙河"
//追加切片元素
s1 = append(s1, m1) //对切片序列化
data, err := json.Marshal(s1)
if err != nil {
fmt.Printf("序列化出错:%v\n", err)
}
fmt.Println("序列化结果:", string(data)) } func testFloat64() {
n1 := 123.22
data, _ := json.Marshal(n1)
fmt.Printf("%T %v\n", string(data), string(data)) }
func main() {
testStruct()
testMap()
testSlice()
testFloat64()
testFloat64() //对基本数据类型序列化场景较少
}
运行结果
序列化结果:{"姓名":"老王","年纪":19,"成绩":99.9}
序列化结果: {"住址":"沙河","名字":"银角大王","年纪":"三十六"}
序列化结果: [{"名字":"牛魔狗","地址":"流沙河","年纪":11}]
string 123.22
string 123.22
1.3. 反序列化
将json字符串反序列化成对应的数据类型(struct、map、slice)等。
package main import (
"encoding/json"
"fmt"
) //自定制序列化后,json字符串的key名,可以用struct的tag标签
type Student struct {
Name string `json:"姓名"`
Age int `json:"年纪"`
Score float64 `json:"成绩"`
} //反序列化结构体
func unmarshalStruct() {
//模拟接收到的json数据,本地需要转义
jsonStr := "{\"姓名\":\"老王\",\"年纪\":19,\"成绩\":99.9}" //定义Stu实例
var stu Student
//反序列化接收字节切片,以及空接口类型
err := json.Unmarshal([]byte(jsonStr), &stu) if err != nil {
fmt.Printf("反序列化出错:%v\n", err)
}
fmt.Printf("反序列化结果:stu=%v stu.Name=%v stu.Age=%v stu.Score=%v\n", stu, stu.Name, stu.Age, stu.Score)
} //反序列化map
func unmarshalMap() { mapStr := "{\"住址\":\"沙河\",\"名字\":\"银角大王\",\"年纪\":\"三十六\"}" //定义变量 接收反序列化数据
var m1 map[string]interface{} //反序列化不需要对map进行make,unmarshal函数已经封装make初始化
err := json.Unmarshal([]byte(mapStr), &m1)
if err != nil {
fmt.Printf("反序列化出错:%v\n", err)
}
fmt.Printf("反序列化结果:%v\n", m1) } //反序列化切片
func unmarishalSlice() {
sliceStr := "[{\"名字\":\"牛魔狗\",\"地址\":\"流沙河\",\"年纪\":11}]" var slice []map[string]interface{}
//切片也不需要在这里make,json.Unmarishal已经封装好make
err := json.Unmarshal([]byte(sliceStr), &qslice)
if err != nil {
fmt.Println("反序列化出错了,", err)
}
fmt.Printf("反序列化结果是:%v\n", slice)
} func main() {
unmarshalStruct()
unmarshalMap()
unmarishalSlice()
}
9.3 Go json的更多相关文章
- 使用TSQL查询和更新 JSON 数据
JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- 【疯狂造轮子-iOS】JSON转Model系列之一
[疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...
- Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)
背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...
- .NET Core系列 : 2 、project.json 这葫芦里卖的什么药
.NET Core系列 : 1..NET Core 环境搭建和命令行CLI入门 介绍了.NET Core环境,本文介绍.NET Core中最重要的一个配置文件project.json的相关内容.我们可 ...
- 一个粗心的Bug,JSON格式不规范导致AJAX错误
一.事件回放 今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...
- JSON.parse()和JSON.stringify()
1.parse 用于从一个字符串中解析出json 对象.例如 var str='{"name":"cpf","age":"23&q ...
- json与JavaScript对象互换
1,json字符串转化为JavaScript对象: 方法:JSON.parse(string) eg:var account = '{"name":"jaytan&quo ...
- .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...
- WebApi接口 - 响应输出xml和json
格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...
随机推荐
- Windows 计划任务 如果选择未登录就运行 则看不到GUI
You can specify that a task should run even if the account under which the task is scheduled to run ...
- [Hands-on-Machine-Learning-master] 02 Housing
用到的函数 numpy.random.permutation随机排列一个序列,返回一个排列的序列. >>> np.random.permutation(10) array([1, 7 ...
- phper:敢问路在何方
很多php程序员存在未来发展方面的困扰,介于各方面的因素,phper 比其他程序员更容易遇到上升天花板. 一方面,一般只有初创企业为了快速实现产品上市以及极容易招到 phper 才使用 php 来实现 ...
- 【JAVA基础】04 Java语言基础:方法
1. 方法概述和格式说明 为什么要有方法 提高代码的复用性 什么是方法 完成特定功能的代码块. 方法的格式 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) { 方法 ...
- Element UI表格组件技巧:如何简洁实现跨页勾选、跨页统计功能
业务场景 在使用Element UI的Table组件时,常常面对这样的业务需求: 表格数据的每一项都要提供勾选框,当切换分页时,能够记忆所有页面勾选的数据,以实现批量提交不同页面勾选数据的功能.并且, ...
- innobackupex 出现Unrecognized character \x01; marked by
centos 7.2 mysql 5.7.16 innobackupex version 2.4.6 [root@Devops-mysql-150-115 sh]# innobackupex --de ...
- 无向图求割点(找桥)tarjan
本博客参考了李煜东的<算法竞赛进阶指南>,大家要是觉得这篇文章写的不错请大家支持正版.豆瓣图书 我在之前的博客中讲解了搜索序时间戳,这次我们讲讲追溯值的概念. 追溯值: 设subtree( ...
- Jmeter系列(8)- test plam测试计划参数详解
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 先了解下测试计划的作用:http ...
- 题目分享R
题意:有n只蚂蚁在木棍上爬行,每只蚂蚁的速度都是每秒1单位长度,现在给你所有蚂蚁初始的位置(蚂蚁运动方向未定),蚂蚁相遇会掉头反向运动,让你求出所有蚂蚁都·掉下木棍的最短时间和最长时间. 分析:(其实 ...
- Java——接口相关知识
1.接口用interface来声明 //定义一个动物接口 public interface Animal{ public void eat(); public void travel(); } 2.接 ...