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

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

运行结果

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_29542611/article/details/80150731