Go结构体和map等数据结构转json字符串
Go语⾔中使⽤json包中的 Marshal() 函数将数据结构转成json字符串,源代码:
func Marshal(v interface{}) ([]byte, error) {
e := newEncodeState()
err := e.marshal(v, encOpts{escapeHTML: true})
if err != nil {
return nil, err
}
buf := append([]byte(nil), e.Bytes()...)
e.Reset()
encodeStatePool.Put(e)
return buf, nil
}
  该函数接收⼀个参数接⼝形式的参数(如果参数定义成接⼝类型)则可以接收任何参数。有两个返回值:字符切⽚、错误。结构体转json:
package main
import (
"encoding/json"
"fmt"
)
//创建结构体
type Student struct {
Id int
Name string
Address []string
IsWork bool
}
//封装返回结构体实例的⽅法
func (s *Student) setStudentInfo(id int,name string,address []string, iswork bool) {
s.Address = address
s.Id = id
s.IsWork = iswork
s.Name = name
}
/
/封装返回结构体实例的⽅法返回结构体的指针
func getStudentInfo(id int,name string,address []string, iswork bool) *Student {
return &Student{id,name,address,iswork}
}
func main() {
var s Student
//初始化结构体
s.setStudentInfo(12,"jack",[]string{"sh","bj"},false)
//将结构体转成json
result , err := json.Marshal(s)
if err != nil {
fmt.Println("error")
}
fmt.Printf("result = %+v\n",string(result))
stu := getStudentInfo(13,"tom",[]string{"北京","上海","深圳"},true)
go语言字符串转数组fmt.Printf("type is %T\n",stu)
fmt.Printf("student = %+v\n",stu)
//获取结构体的name属性本来是指针,但是可以直接获取其属性,这是go语⾔的语法糖
fmt.Println("stu.Name = ",stu.Name)
fmt.Println("(*stu).Name = ",(*stu).Name)
result2,err2 := json.Marshal(stu)
if err2 != nil {
fmt.Println("error")
}
fmt.Println(string(result2))
}
map转json:
package main
import (
"encoding/json"
"fmt"
)
func main() {
m := make(map[string]interface{})
m["name"] = "jack"
m["address"] = []string{"北京","河南"}
m["iswork"] = false
m["age"] = 18
result,err := json.Marshal(m)
if err !=nil {
fmt.Println("error")
}
fmt.Println(string(result))
}
json转结构体:
package main
import (
"encoding/json"
"fmt"
)
/**
json转结构体
*/
func main() {
//json串内包含⼀个切⽚⼀个 int类型的age  ⼀个bool类型的iswork 和⼀个字符串类型的name  jsonStr := `{"Address":["北京","河南"],"Age":18,"Iswork":false,"Name":"jack"}`
var p Person
json.Unmarshal([]byte(jsonStr),&p)
fmt.Printf(" p = %+v\n",p)
}
//定义结构体
//结构体的名字⾸字母⼀定要⼤写,不然解析不出来
type Person struct {
Name string
Age int
Iswork bool
Address []string
}
json转map:
package main
import (
"encoding/json"
"fmt"
)
func main() {
//json串内包含⼀个切⽚⼀个 int类型的age  ⼀个bool类型的iswork 和⼀个字符串类型的name  jsonStr := `{"Address":["北京","河南"],"Age":18,"Iswork":false,"Name":"jack"}`
m := make(map[string]interface{})
json.Unmarshal([]byte(jsonStr),&m)
//fmt.Println(m)
//fmt.Printf("m = %+v\n",m)
for key,value := range m{
//fmt.Printf("m[%s] = %+v\n",key,value)
//if key == "Address" {
// fmt.Printf("%T\n",value)//得出类型为接⼝类型 []interface {}  原本为切⽚类型
//}
//通过断⾔推出数据的类型
switch data := value.(type) {
case string:
fmt.Printf("m[%s] = %s\n",key,data)
case float64:
fmt.Printf("m[%s] = %f\n",key,data)
case bool:
fmt.Printf("m[%s] = %v\n",key,data)
case []string:
fmt.Println("是字符串切⽚类型")
case []interface{}:
fmt.Printf("是接⼝切⽚类型: %s =====> %v\n",key,data)
fmt.Println("======开始遍历切⽚======")
for index,v := range data{
fmt.Printf("%s[%d] = %s\n",key,index,v)
}
fmt.Println("======遍历切⽚结束======")
}
}
}
如果不通过断⾔去判断类型,如果需要遍历json串内切⽚的数据就没办法操作了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。