Go语言编程—Go语言中JSON的处理(map、struct 和 JSON字符串的相互转换)
程序员文章站
2022-05-02 15:13:43
...
JSON的简单介绍
JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成。尽管JSON是JavaScript的一个子集,但JSON采用完全独立于编程语言的文本格式,且表现为键/值对集合的文本描述形式(类似一些编程语言中的字典结构),这使它成为较为理想的、跨平台、跨语言的数据交换语言。正是由于是键值对形式,那么很好的和Go语言中的struct 和 map对应。
代码示例
在下面代码中struct->json,map->json,json->struct,json->map
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
Name string `json:"-"` //对应的json的可以也是大写,可以指定json的二次编码 ,-不会输出到json
Age int `json:"age,string"` //输出为字符串
Sex byte `json:"性别"` //会转出数字!怎么转出字符?
Is bool
Like []string
Addr string
}
//结构体->json
func structToJson() {
//转换从json的字段必须首字母大写
stu := Student{"Laymond", 18, 'm', true, []string{"跑步", "爬山", "学习"}, "中国.重庆"}
//json_byte, err := json.Marshal(stu)
json_byte, err := json.MarshalIndent(stu, "", " ") //看上去更加格式化
if err != nil {
fmt.Println("json.Marshal error")
return
}
fmt.Println(string(json_byte))
}
//map->json
func mapToJson() {
stu := make(map[string]interface{}, 6)
stu["name"] = "Laymond"
stu["age"] = 18
stu["sex"] = 'm'
stu["is"] = true
stu["like"] = []string{"看书", "学习"}
stu["addr"] = "中国.重庆"
//json_byte, err := json.Marshal(stu)
json_byte, err := json.MarshalIndent(stu, "", " ") //看上去更加格式化
if err != nil {
fmt.Println("json.Marshal error")
return
}
//当然map是无序
fmt.Println(string(json_byte))
}
//json字符串->struct
func jsonToStruct() {
// 要结构体一一对应,尤其是json二次编码格式
str := `
{
"age": "18",
"性别": 109,
"Is": true,
"Like": [
"跑步",
"爬山",
"学习"
],
"Addr": "中国.重庆"
}
`
var stu Student
json.Unmarshal([]byte(str), &stu)
fmt.Println(stu)
}
//json字符串->map
func jsonToMap() {
str := `
{
"age": 18,
"sex": 109,
"Is": true,
"like": [
"跑步",
"爬山",
"学习"
],
"Addr": "中国.重庆"
}
`
stu := make(map[string]interface{}, 10)
json.Unmarshal([]byte(str), &stu)
fmt.Println(stu)
//可以用对应的value类型赋值吗?不可以 接口类型不可以转 其他类型,只能通过类型断言
var name interface{} = "Laymond"
// var name_str string = string(name) //error
var name_str string
//断言只能用在if 和 switch ,下面是指定类型断言
if data, ok := name.(string); ok == true {
name_str = data
fmt.Println(name_str)
}
var stu_str string
//var a_int, b_int int
for key, value := range stu {
switch data := value.(type) {
//int和byte类型匹配不到 或许int 类型太多了,不好匹配?
case int8:
fmt.Printf("key = %v ,%v is int\n", key, data)
case byte:
fmt.Printf("key = %v ,%v is byte\n", key, data)
case string:
stu_str = data
fmt.Printf("key = %v ,%v is string\n", key, data)
case bool:
fmt.Printf("key = %v ,%v is bool\n", key, data)
case []interface{}:
fmt.Printf("key = %v ,%v is interface\n", key, data)
}
}
fmt.Println(stu_str)
}
func main() {
fmt.Println("---------struct-> json---------")
structToJson()
fmt.Println("---------map-> json------------")
mapToJson()
fmt.Println("---------json -> struct-------")
jsonToStruct()
fmt.Println("---------json -> map----------")
jsonToMap()
}