各种数据类型和JSON的互相转换

  map和JSON的互相转换

package main

import (
   "encoding/json"
   "fmt"
)

func main() {
   var data = map[string]any{}
   data["errcode"] = 40029
   data["errmsg"] = "invalid code"

   // map转JSON
   jsonByte, _ := json.Marshal(data)
   jsonStr := string(jsonByte)
   fmt.Println("jsonStr =", jsonStr) // jsonStr = {"errcode":40029,"errmsg":"invalid code"}

   // JSON转map
   dataMap := map[string]any{}
   _ = json.Unmarshal([]byte(jsonStr), &dataMap) // 注意这里是传内存地址,不是传值
   fmt.Println("dataMap =", dataMap)             // dataMap = map[errcode:40029 errmsg:invalid code]
}

  切片(或数组)和JSON的互相转换

package main

import (
   "encoding/json"
   "fmt"
)

func main() {
   s := []string{"张三", "李四", "王五"}

   // 切片转JSON
   jsonByte, _ := json.Marshal(s)
   jsonStr := string(jsonByte)
   fmt.Println("jsonStr =", jsonStr) // jsonStr = ["张三","李四","王五"]

   // JSON转切片
   var slice []string
   _ = json.Unmarshal([]byte(jsonStr), &slice) // 注意这里是传内存地址,不是传值
   fmt.Println("slice =", slice)               // slice = [张三 李四 王五]
}

  结构体和JSON的互相转换

package main

import (
   "encoding/json"
   "fmt"
)

// human 定义一个名为human的结构体
type human struct {
   Name   string `json:"name"`   // 姓名
   Age    int    `json:"age"`    // 年龄
   Gender string `json:"gender"` // 性别
}

func main() {
   hum := &human{}
   (*hum).Name = "张三"
   (*hum).Age = 18
   (*hum).Gender = "男"

   // 结构体转JSON
   jsonByte, _ := json.Marshal(hum)
   jsonStr := string(jsonByte)
   fmt.Println("jsonStr =", jsonStr) // jsonStr = {"name":"张三","age":18,"gender":"男"}

   // JSON转结构体
   var h = &human{}
   _ = json.Unmarshal([]byte(jsonStr), h)
   fmt.Println("h =", h) // h = &{张三 18 男}
}

//========== 总结 ==========//
// 1、结构体字段名首字母必须大写,否则转JSON时无法获取数据(但不会报错)。
// 2、结构体转JSON时如果不想字段名首字母为大写可以给字段加标签,如Name字段加上了标签『`json:"name"`』,在转JSON时就
//    会输出name,而不是Name。

Copyright © 2024 码农人生. All Rights Reserved