Go语言编程动手练习丨编程实现集合与JSON互换 您所在的位置:网站首页 js的常用类型 Go语言编程动手练习丨编程实现集合与JSON互换

Go语言编程动手练习丨编程实现集合与JSON互换

2023-04-22 11:51| 来源: 网络整理| 查看: 265

423来清华社多得IT BOOK!

在Web开发中,JSON是一种常用的数据类型,它也是以键值对格式表示的,其数据结构和Go语言的集合非常相似,网页前端与后台系统的通信往往使用JSON数据传输较多,所以集合和JSON之间的数据转换是经常使用的。

虽然JSON也是以键值对(key-value)方式表示的,但每对键值对(key-value)的数据类型各不相同,且Go语言是静态强类型编程语言,因此集合和JSON会存在数据差异,集合与JSON的转换需要使用内置包encoding/json实现,示例如下:

package main import ( "encoding/json" "fmt" ) func main() { // 定义字符串,用于记录JSON数据 var j string j=`{"infos":[{"name":"Tom","age":15},{"name":"Lily","age":20}]}` // 定义集合,value的数据类型为接口interface类型 var m1 = map[string]interface{}{} // 将JSON字符串转换为集合 json.Unmarshal([]byte(j), &m1) // 遍历输出JSON for k, v := range m1 { fmt.Printf("集合m1的键为:%v\n", k) fmt.Printf("集合m1的值为:%v\n", v) // 解析JSON里面的数组 vv := v.([]interface{}) for i := 0; i 运行上述代码,运行结果如图所示。 运行结果

JSON一般以字符串形式进行通信传递,因此上述代码定义字符串变量j,它用于记录JSON数据,然后使用内置包encoding/json对字符串变量j进行解析,说明如下:

1)定义集合m1,它的键(key)设置为字符串类型,值(value)设置为空接口,它可以存储函数方法和不同数据类型的变量,它能兼容JSON不同数据类型的值(value)。图6-17 运行结果

2)使用内置包encoding/json的Unmarshal()对字符串变量j进行JSON解析,解析过程需要将字符串变量j转为字节类型的切片格式,再将解析结果存放在集合m1中。Unmarshal()第一个参数将字符串变量j转为字节类型的切片格式;第二个参数传递集合m1的内存地址,解析结果会自动记录在集合m1中。

3)由于JSON数据是嵌套结构,最外层结构只有一对键值对,键为infos,值为一个切片(数组)类型的数据,当取到键为infos的值并对该值进行解析的时候,需要对该值设置数据类型,如v.([]interface{}),否则Go语言无法解析JSON里面的数组数据。

4)JSON里面数组的每个元素都是键值对表示的,相当于Go语言的集合,解析数组元素的时候,还需要为每个元素设置数据类型,如vv[i].(map[string]interface{})。

综上所述,Go语言解析JSON字符串需要使用内置包encoding/json的Unmarshal(),解析结果保存在集合中,并且集合的值(value)的数据类型为接口(interface)类型,如果JSON里面嵌套了数组或JSON,则需要对嵌套的数组或JSON设置相应数据类型。

切片和集合是可以组合使用的,比如切片的某个元素是集合,集合的某个键值对的值是切片,这种组合在日常开发中十分常见。

上述例子将JSON转换为集合,若要将集合转换为JSON,可以使用内置包encoding/json的Marshal()实现,示例如下:

package main import ( "encoding/json" "fmt" ) func main() { // 定义集合 var m1 = map[string]interface{}{} m1["name"] = "Tom" m1["age"] = 10 fmt.Printf("m1的数据为:%v\n", m1) var m2 = map[string]interface{}{} m2["name"] = "Lily" m2["age"] = 20 fmt.Printf("m2的数据为:%v\n", m2) // 定义切片 var s1 = []map[string]interface{}{m1, m2} fmt.Printf("s1的数据为:%v\n", s1) // 定义集合,键为字符串类型,值为接口类型 var m3 = map[string]interface{}{} m3["infos"] = s1 data, _ := json.Marshal(&m3) fmt.Printf("JSON数据为:%v\n", string(data)) }

运行上述代码,运行结果如图所示。

运行结果

分析代码与运行结果,我们得出以下结论:

1)首先定义集合m1和m2并设置键值对,每对键值对的值是不同数据类型的数据。

2)然后定义切片s1,其数据类型是集合m1和m2的数据类型,将集合m1和m2写入切片s1,作为切片元素。

3)下一步定义集合m3并设置键值对,键(key)为infos,值(value)为切片s1,再使用内置包encoding/json的Marshal()将集合m3转换为JSON字符串。Marshal()的参数传递集合m3的内存地址,函数设有两个返回值,第一个返回值data表示转换结果,以字符类型的切片表示;第二个返回值是转换信息,用于记录转换失败等异常信息。

4)最后将转换结果从字符类型的切片转为字符串类型,使用内置函数方法string()实现数据类型转换。

综上所述,集合转换JSON首先分析集合每个元素的数据结构,如果集合嵌套了内置容器,比如数组、切片、集合等数据,必须从嵌套的数据进行构建,再把构建好的数据作为集合元素,最后使用内置包encoding/json的Marshal()和内置函数方法string()完成转换过程。

本文内容摘自黄永祥《Go语言编程从入门到实践》,了解更多Go语言编程知识请购买正版图书。

423来清华社多得IT BOOK!

《GO语言编程从入门到实践》(黄永祥)【简介_书评_在线阅读】 - 当当图书

《GO语言编程从入门到实践》(黄永祥) -京东



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有