9.3 Go json

json是一种轻量级的数据交换格式,易于机器解析,是种key-value格式。

JavaScript Object Notation是中种主流的数据格式。

json常用于网络传输

先将程序数据(如map、struct等)序列化成json字符串
接收方得到json字符串时,进行反序列化成原有数据类型

JS语言中,任何数据类型都可以通过JSON表示,如字符串、数字、对象、数组、map、结构体等。
JSON用键值对保存数据

1.1. 在线解析json网址

https://www.json.cn/

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的更多相关文章

  1. 使用TSQL查询和更新 JSON 数据

    JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...

  2. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  3. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  4. Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)

    背景: 1:有用户反馈了关于跨域请求的问题. 2:有用户反馈了参数获取的问题. 3:JsonHelper的增强. 在综合上面的条件下,有了2.2版本的更新,也因此写了此文. 开源地址: https:/ ...

  5. .NET Core系列 : 2 、project.json 这葫芦里卖的什么药

    .NET Core系列 : 1..NET Core 环境搭建和命令行CLI入门 介绍了.NET Core环境,本文介绍.NET Core中最重要的一个配置文件project.json的相关内容.我们可 ...

  6. 一个粗心的Bug,JSON格式不规范导致AJAX错误

    一.事件回放  今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...

  7. JSON.parse()和JSON.stringify()

    1.parse 用于从一个字符串中解析出json 对象.例如 var str='{"name":"cpf","age":"23&q ...

  8. json与JavaScript对象互换

    1,json字符串转化为JavaScript对象: 方法:JSON.parse(string) eg:var account = '{"name":"jaytan&quo ...

  9. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

  10. WebApi接口 - 响应输出xml和json

    格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...

随机推荐

  1. Mac home 目录下创建文件夹

    example:sudo vim /etc/auto_master before: # Automounter master map +auto_master # Use directory serv ...

  2. 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 ...

  3. 阿里云有奖调查结果公布,赠送10个阿里巴巴logo胸针 ...

    4月17日,我们发起了"阿里云有奖调查!赠10个阿里巴巴logo胸针"活动,现经过随机抽奖机抽选出10名幸运同学,每人赠送一枚阿里巴巴胸针.现把获奖同学ID公布如下,请如下同学私信 ...

  4. P1886 滑动窗口 单调队列

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  5. 线程状态及各状态下与锁和CPU的关系

    线程的状态 Thread.State枚举类型中定义了线程的六种状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING和TERMINATED. 线程在某一时刻只能拥有 ...

  6. Bind+DLZ+MySQL智能DNS的正向解析和反向解析实现方法

    使用文本配置文件的配置方式结合bind的最新的acl和view特性来实现智能DNS想必很多人已经很熟悉了,使用MySQL数据库来存放zone文件的方式可能也不少.对于两者都熟悉的,实现 Bind+DL ...

  7. 洛谷 2016 战略游戏(树形DP)

    题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能 ...

  8. Spring依赖注入—@Resource注解使用

    1.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowire ...

  9. 2020 wannafly camp 补题 day1

    题目可以从牛客上找到. 最简单的一个题应该是B B. 密码学 这个应该就是倒着推,题目给了你加密的顺序,所以我们逆推这个就可以得到每一次加密前的字符串. 1H. 最大公约数 题目大意就是给你一个范围1 ...

  10. 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 ...