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的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...
随机推荐
- Mac home 目录下创建文件夹
example:sudo vim /etc/auto_master before: # Automounter master map +auto_master # Use directory serv ...
- HDU 5954 Do Not Pour Out
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) #defi ...
- 阿里云有奖调查结果公布,赠送10个阿里巴巴logo胸针
...
4月17日,我们发起了"阿里云有奖调查!赠10个阿里巴巴logo胸针"活动,现经过随机抽奖机抽选出10名幸运同学,每人赠送一枚阿里巴巴胸针.现把获奖同学ID公布如下,请如下同学私信 ...
- P1886 滑动窗口 单调队列
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- 线程状态及各状态下与锁和CPU的关系
线程的状态 Thread.State枚举类型中定义了线程的六种状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING和TERMINATED. 线程在某一时刻只能拥有 ...
- Bind+DLZ+MySQL智能DNS的正向解析和反向解析实现方法
使用文本配置文件的配置方式结合bind的最新的acl和view特性来实现智能DNS想必很多人已经很熟悉了,使用MySQL数据库来存放zone文件的方式可能也不少.对于两者都熟悉的,实现 Bind+DL ...
- 洛谷 2016 战略游戏(树形DP)
题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能 ...
- Spring依赖注入—@Resource注解使用
1.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowire ...
- 2020 wannafly camp 补题 day1
题目可以从牛客上找到. 最简单的一个题应该是B B. 密码学 这个应该就是倒着推,题目给了你加密的顺序,所以我们逆推这个就可以得到每一次加密前的字符串. 1H. 最大公约数 题目大意就是给你一个范围1 ...
- C - A Plug for UNIX POJ - 1087 网络流
You are in charge of setting up the press room for the inaugural meeting of the United Nations Inter ...