首页 > golang > go中JSON操作实战
2021
01-23

go中JSON操作实战

生成json

1.将struct或者map解析为json

package main

import (
   "encoding/json"
   "fmt"
)

type student struct {
   Name   string
   Age    int
   School string
   Kemu   []string
}

func main() {
   tommy := student{"tommy", 27, "重庆大学", []string{"物理", "数学", "化学"}}
   json_tommy, err := json.Marshal(tommy) //转换为json,失败报错err
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(string(json_tommy))
   json_tommy, err = json.MarshalIndent(tommy, "", " ") //格式化转换为json,用户在界面可以看到格式化json,不是一排的
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(string(json_tommy))
}

注意:结构体里面变量一定要大写,不然转换完是{}

如果想要转换完的key小写,可以通过struct_tag实现

通过map生成json

package main

import (
   "encoding/json"
   "fmt"
)

func main() {
   m := make(map[string]interface{}, 4)
   m["name"] = "tommy"
   m["age"] = 22
   m["isactive"] = true
   result, err := json.Marshal(m)
   if err != nil {
      fmt.Println("Json解析错误")
   }
   fmt.Println(string(result))
}


JSON转为结构体或者map

package main

import (
   "encoding/json"
   "fmt"
)

type student struct { //丁一一一个结构体,里面key和类型和json一直
   Name   string `json:"name"` //注意,如果json key是小写,这里需要添加json:"json小写的字"
   Age    int
   School string
   Kemu   []string
}

func main() {
   json_data := `         
{
"name": "tommy",
"Age": 27,
"School": "重庆大学",
"Kemu": [
"物理",
"数学",
"化学"
]}  
` //定义一个json数据
   var tmp student                                //定义一个student类型的变量
   err := json.Unmarshal([]byte(json_data), &tmp) //将json转换为结构体类型,注意1传入是一个切片的json,需要改变结构体类容,这里需要写结构体的指针
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(tmp)
}

json转换为map

package main

import (
   "encoding/json"
   "fmt"
)

func main() {
   json_data := `
{
"name": "tommy",
"Age": 27,
"School": "重庆大学",
"Kemu": [
"物理",
"数学",
"化学"
]}
`
   var json_map map[string]interface{} //定义一个map,由于值不固定,采用interface空接口
   err := json.Unmarshal([]byte(json_data), &json_map)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(json_map)
   //如果需要用数据,因为map后面里面都是interface类型,需要断言才能用
   for k, v := range json_map {
      switch data := v.(type) {
      case string:
         fmt.Println("index:%s    ,val:%v   string", k, data)
      case int:
         fmt.Println("index:%s    ,val:%v   int", k, data)
      case []interface{}: //如果是切片是 []interface{}类型
         fmt.Println("index:%s    ,val:%v   []interface{}", k, data)
      }
   }
}

综上:json转为map简单,但是如果需要用就需要断言,很麻烦,所以最好是json转换结构体,结构体需要先定义

本文》有 0 条评论

留下一个回复