前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang json解析与生成

Golang json解析与生成

作者头像
恋喵大鲤鱼
发布2019-06-14 20:43:33
2.7K0
发布2019-06-14 20:43:33
举报
文章被收录于专栏:C/C++基础C/C++基础

JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及浏览器的內建快速解析支持,使得其更适用于网络数据传输领域。

Golang自带的JSON解析库encoding/json,可以用起将结构化数据序列化成json字符串或从json字符串中解析出我们想要的数据。

1.解析json

给一个较为复杂的json字符串,包含数组,数组的元素是json对象。我们需要取出数组第一个元素中的某一个字段值。其它的解析均可参考下面的代码。

代码语言:javascript
复制
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)
                                }
                        }
                }
        }
}

程序输出:

代码语言:javascript
复制
value=[]interface {}{map[string]interface {}{"picture":"http://qqpublic.qpic.cn/avatar.jpg", "duration":"839"}}
d=839,type=string

解析json字符串时,需要注意如下几点: (1)Go类型和JSON类型的对应关系如下:

代码语言:javascript
复制
map[string]interface{}代表JSON对象
[]interface{}代表JSON数组
bool代表JSON booleans
float64代表JSON numbers
string代表JSON strings
nil 代表JSON null

2.生成json

假设我们有如下一个类(结构体)student 及其一个实例对象st,将其序列化为json,具体实现如下:

代码语言:javascript
复制
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))
}

程序输出结果:

代码语言:javascript
复制
{"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字符串是纯粹的字符串。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年05月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.解析json
  • 2.生成json
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档