欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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()
}

运行结果

Go语言编程—Go语言中JSON的处理(map、struct 和 JSON字符串的相互转换)