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

标签:golang,解析,json,生成
0
投稿

猜你喜欢

  • 使用python计算方差方式——pandas.series.std()

    2022-05-24 14:03:35
  • JavaScript回调函数callback用法解析

    2024-04-22 22:12:48
  • Python 3.6 读取并操作文件内容的实例

    2021-11-21 16:52:14
  • python 调用win32pai 操作cmd的方法

    2023-11-15 12:32:09
  • python操作docx写入内容,并控制文本的字体颜色

    2023-11-25 03:14:33
  • 最新整理Python中的type和object的示例详解

    2023-08-10 05:21:44
  • python多进程下实现日志记录按时间分割

    2022-10-07 21:00:24
  • IIS 301重定向与程序代码实现301重定向的差别

    2022-04-16 07:45:23
  • SQLServer注释快捷键操作

    2024-01-25 20:45:38
  • python 获取一个值在某个区间的指定倍数的值方法

    2023-04-08 17:19:07
  • 利用pandas按日期做分组运算的操作

    2021-03-06 09:16:17
  • 用SQL Server事件探查器创建跟踪

    2009-02-24 17:45:00
  • python如何实现MK突变检验方法,代码复制修改可用

    2022-04-10 13:31:18
  • Python中的groupby分组功能的实例代码

    2021-09-17 20:48:15
  • 关于爬虫中scrapy.Request的更多参数用法

    2023-10-14 02:20:26
  • Python实现列表拼接和去重的三种方式

    2021-05-02 23:43:54
  • SQL Server 2012 sa用户登录错误18456的解决方法

    2024-01-21 03:51:29
  • 如何实现网上站点维护?

    2010-05-24 18:35:00
  • python 与服务器的共享文件夹交互方法

    2021-02-10 14:29:02
  • 5招带你轻松优化MySQL count(*)查询性能

    2024-01-28 04:40:58
  • asp之家 网络编程 m.aspxhome.com