Golang 如何解析和生成json
作者:Dabelv 发布时间:2024-04-27 15:32:58
JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及浏览器的內建快速解析支持,使得其更适用于网络数据传输领域。
Golang自带的JSON解析库encoding/json,可以用起将结构化数据序列化成json字符串或从json字符串中解析出我们想要的数据。
1.解析json
给一个较为复杂的json字符串,包含数组,数组的元素是json对象。我们需要取出数组第一个元素中的某一个字段值。其它的解析均可参考下面的代码。
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := []byte(`{"uin":1589276509,"feedID":10000,"videos":[{"picture":"http://qqpublic.qpic.cn/avatar.jpg","duration":"839"}]}`)
var jsonMap map[string]interface{}
if err := json.Unmarshal(jsonStr, &jsonMap); err!=nil {
fmt.Printf("json decode failed, err=%v", err)
return
}
value, ok:=jsonMap["videos"]
fmt.Printf("value=%#v\n", value)
if ok {
sliceValue, ok := value.([]interface{})
if ok {
mapValue, ok := sliceValue[0].(map[string]interface{})
if ok {
duration, ok := mapValue["duration"]
if ok {
fmt.Printf("d=%v,type=%T\n",duration,duration)
}
}
}
}
}
程序输出:
value=[]interface {}{map[string]interface {}{"picture":"http://qqpublic.qpic.cn/avatar.jpg", "duration":"839"}}
d=839,type=string
解析json字符串时,需要注意如下几点:
(1)Go类型和JSON类型的对应关系如下:
map[string]interface{}代表JSON对象
[]interface{}代表JSON数组
bool代表JSON booleans
float64代表JSON numbers
string代表JSON strings
nil 代表JSON null
2.生成json
假设我们有如下一个类(结构体)student 及其一个实例对象st,将其序列化为json,具体实现如下:
package main
import (
"encoding/json"
"fmt"
)
type Stu struct {
Name string `json:"name"`
Age int
sex string
Class *Class `json:"class"`
}
type Class struct {
Name string
Grade int
}
func main() {
//实例化一个数据结构,用于生成json字符串
stu := Stu{
Name: "张三",
Age: 18,
sex: "男",
}
//指针变量
cla := new(Class)
cla.Name = "1班"
cla.Grade = 3
stu.Class=cla
//Marshal失败时err!=nil
jsonStu, err := json.Marshal(stu)
if err != nil {
fmt.Println("生成json字符串错误")
}
//jsonStu是[]byte类型,转化成string类型便于查看
fmt.Println(string(jsonStu))
}
程序输出结果:
{"name":"张三","Age":18,"class":{"Name":"1班","Grade":3}}
阅读以上代码可以看出:
(1)只要是可导出成员(变量首字母大写),都可以转成json。因成员变量sex是不可导出的,故无法转成json;
(2)如果变量打上了json标签,如Name旁边的 json:"name"
,那么转化成的json key就用该标签“name”,否则取字段名作为key,如"Age";
(3)指针变量,编码时自动转换为它所指向的值,如Class变量;
(4)强调一句,序列化成功后的json字符串是纯粹的字符串。
来源:https://cloud.tencent.com/developer/article/1446290
猜你喜欢
- 一. 官网下载MySQL官方网址:(https://www.mysql.com/) 或者点击这里下载:https://www.jb
- 实现效果在网站页面上,点击某个超链接,页面跳转到某个位置,跳转过程有一个动画滚动效果,这是一种比较酷的体验。这种效果是如何实现的呢,本文通过
- function createHashDir($sign) { $md5 = md5($sign); if(!is_dir(MB_CACHE
- The WeekdayName function returns the weekday name of a specified day o
- 1.在html页面中导入js文件和css文件<link rel="stylesheet" href=".
- 本文实例为大家分享了opencv矿石图片检测矿石数量的具体代码,供大家参考,具体内容如下原始矿石图片此类图片是高躁图,二值化后图像如下采用膨
- 前言几乎每个程序都需要用到图片。下面就来给大家介绍前端+PHP后端实现微信小程序实现图片上传功能,分享出来供大家参考学习,下面话不多说了,来
- 数据库查询优化的实用技巧:本文中,abigale代表查询字符串,ada代表数据表名,alice代表字段名。技巧一:问题类型:ACCESS数据
- 本地环境设置在这里我们介绍设置Go编程语言环境,需要在你的计算机上的准备以下两个软件,(A)文本编辑器和(B)Go编译器。文本编辑器这将用来
- 第一次使用python写程序,确实比C/C++之类方便许多。既然这个抽奖的数据不大,对效率要求并不高,所以采用python写,更加简洁、清晰
- 共4个页面:form.asp; chk.asp; num.asp; count.asp,得到一个随即数字。加密解密后成成XBM图片,利用 s
- 本文实例为大家分享了微信小程序实现视频播放器发送弹幕的具体代码,供大家参考,具体内容如下一、视频播放器video-detail 视频播放器s
- 下面是一个实战项目的结果。 #coding: utf-8 import Image,ImageDraw,ImageFont,os,strin
- 本文实例讲述了Python实现的将文件每一列写入列表功能。分享给大家供大家参考,具体如下:# -*- coding: utf-8 -*-#!
- MySql 8.0 对应驱动包匹配MySql 数据库更新为8.0及以上后,对应的应用程序数据库链接驱动包也要更新为8.0版本。否则会报驱动异
- MatrixOne是一个新一代超融合异构数据库,致力于打造单一架构处理TP、AP、流计算等多种负载的极简大数据引擎。MatrixOne由Go
- 前言web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展。然而,正所谓成也萧何败也萧何,开放的特性、搜索引
- 一、数据库编程的必备条件编程语言: 如Java、C++、C、Python等数据库: 如Oracle、MySQL、SQL Server等数据库
- 安装SQL Server 2005弄了好久,终于可以了。。。期间问题重重,想拿出来和大家一同分享的。第一种错误显示:无法在com+目录中安装
- Django带有一个form库,称为django.forms,这个库可以处理我们本章所提到的包括HTML表单显示以及验证。 接下来我们来深入