海棠网站注册,郑州企业网站排行,中国空间站和国际空间站对比,广东网站优化目录
何为JSON
编码JSON
实践时刻
解码JSON
实践时刻
延伸拓展 何为JSON JSON (JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。JSON最初是JavaScript的一部分#xff0c;后由于便于快速编写的特性#xff0c;被开发者独立出来。基本上所有的语…目录
何为JSON
编码JSON
实践时刻
解码JSON
实践时刻
延伸拓展 何为JSON JSON (JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。JSON最初是JavaScript的一部分后由于便于快速编写的特性被开发者独立出来。基本上所有的语言都支持JSON数据的编码和解码。对于网络编程而言JSON的重要性不言而喻。 JSON中的键以字符串存储值可以取任意类型。 它有以下三种结构:
字符串或数组类型{name:Mark,age:18}JSON数组[{name: Tom,age:18},{name:Jerry,age:17}]嵌套类型{name: Tom, birthday:{month:12,day:25}} 大括号“{}”用来描述一组“不同类型的无序键值对集合”,方括号“[]”用来描述一组“相同类型的有序数据集合”。 编码JSON GO的标准库提供了 encoding/json 来处理JSON。涉及到的接口有以下几种
func Marshal(v interface{}) ([]byte, error) Marshal函数要求提供一个接口类型的参数通常interface{}类型会用结构体和map等数据结构来传入。 还有一种JSON编码接口提供格式化输出的操作
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) MarshalIndent是Marshal的升级版可以按照所设计的特定格式进行格式化输出。其中prefix参数用于对每字段进行标记分隔。
实践时刻 代码示例
/*
------------------------------------------------------------------------------- FILE map2json.go- AUTHOR MAX TSANG- EMAIL ZIHANTSANGHOTMAIL.COM- DATE 2023/07/23 16:46:43- BRIEF MAP2JSON------------------------------------------------------------------------------
*/package mainimport (encoding/jsonfmt
)func main() {data_map : make(map[string]interface{}, 5)data_map[name] Markdata_map[sex] maledata_map[age] 24data_map[birth] 1998-01-01data_map[Education] []string{Bachelor,Master}res, _ : json.Marshal(data_map) //_对error信息省略res_format, _ : json.MarshalIndent(data_map, , )fmt.Println(result , string(res))fmt.Println(result with format , string(res_format))
} 输出结果 除此之外我们还可以用结构体struct来与JSON进行互转 * 一般情况下推荐都使用结构体struct来进行编解码操作 代码示例
/*
------------------------------------------------------------------------------- FILE struct2json.go- AUTHOR MAX TSANG- EMAIL ZIHANTSANGHOTMAIL.COM- DATE 2023/07/23 16:51:22- BRIEF STRUCT2JSON------------------------------------------------------------------------------
*/package mainimport (encoding/jsonfmt
)type Resume struct {Name string json:name Sex string json:sex Age int json:age Education []string json:education Inservice bool json:inservice
}func main() {resume : Resume{Mark, female, 24,[]string{bachelor,master}, false}res, err : json.MarshalIndent(resume, , )if err ! nil {fmt.Println(err)}fmt.Println(result , string(res))
} 输出结果 在编辑struct字段时可以在字段后添加标签来控制编解码的过程。控制字段有以下三种
- : 不解析该字段omitempty : 当字段为空或长度为0(map array string等结构)时不解析FieldName: 解析JSON时使用该名称 在代码示例中的name sex age ... 这些都属于FieldName 解码JSON 在对JSON解码时标准库提供了Unmarshal接口。
func Unmarshal(data []byte, v interface{}) error Unmarshal函数解析JSON时需要传入一个接口类型的参数而写入接口有以下类型
数据类型对照关系Bool对应JSON布尔类型float64对应JSON数字类型string对应JSON字符串类型[]interface{}对应JSON数组map[string]interface{}对应JSON对象nil对应JSON的null 当JSON值与给出的目标类型不匹配或JSON输出的值超出写入目标类型的范围内Unmarshal会自动跳过该字段并完成其余的解码操作 。
实践时刻 代码示例
/*
------------------------------------------------------------------------------- FILE json2map.go- AUTHOR MAX TSANG- EMAIL ZIHANTSANGHOTMAIL.COM- DATE 2023/08/09 12:24:07- BRIEF JSON2MAP------------------------------------------------------------------------------
*/
package mainimport (encoding/jsonfmt
)func main() {//一串模拟Json文本js :
{name:Mark,sex:male,age:24,birth:1998-01-01,Education:[Bachelor,Master]
}m : make(map[string]interface{}, 5)err : json.Unmarshal([]byte(js), m) //将json解码并传至mif err ! nil {fmt.Println(err)}fmt.Println(map , m)for k, v : range m {switch data : v.(type) /*类型值.(type)可以取到其数据类型*/ {case string:fmt.Printf(map[%s]的值类型为stringvalue %s\n, k, data)case []string:fmt.Printf(map[%s]的值类型为[]stringvalue %v\n, k, data)case float64:fmt.Printf(map[%s]的值类型为intvalue %f\n, k, data)case bool:fmt.Printf(map[%s]的值类型为boolvalue %t\n, k, data)case []interface{}:fmt.Printf(map[%s]的值类型为[]interface{}value %v\n, k, data)}}
}输出结果 不难发现解码json时若采用map结构则需对值的数据类型进行判断才可正确进行输出调用。struct结构体相较于map可以很好解决这类问题JSON库也会自动对结构体的类型进行解析无需进行类型判断。 代码示例
/*
------------------------------------------------------------------------------- FILE json2struct.go- AUTHOR MAX TSANG- EMAIL ZIHANTSANGHOTMAIL.COM- DATE 2023/08/09 12:42:12- BRIEF JSON2STRUCT------------------------------------------------------------------------------
*/
package mainimport (encoding/jsonfmt
)type Resume2 struct {Name string json:nameSex string json:sexAge int json:ageEducation []string json:educationInservice bool json:inservice
}func main() {js :
{name:Mark,sex:male,age:24,education:[Bachelor,Master],Inservice:false
}var resume Resume2err : json.Unmarshal([]byte(js), resume)if err ! nil {fmt.Println(err)}fmt.Printf(resume %v, resume)}输出结果 延伸拓展 Go所提供的标准 encoding/json 可以满足我们基本的对于JSON的编码、解码操作但性能上并不是最佳有一个性能更好的开源项目- Fastjson 可以帮助我们解决这个问题。如果感兴趣可以到GitHub上查找该项目