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)
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串内切片的数据就没办法操作了。

Go 结构体和map等数据结构转json字符串的更多相关文章

  1. 结构体作为map的key或放入set中,需要重载<运算符

    结构体作为map的key或放入set中,需要重载<运算符,如下: typedef struct tagRoadKey{    int m_i32Type;    int m_i32Scale; ...

  2. GO学习-(38) Go语言结构体转map[string]interface{}的若干方法

    结构体转map[string]interface{}的若干方法 本文介绍了Go语言中将结构体转成map[string]interface{}时你需要了解的"坑",也有你需要知道的若 ...

  3. Golang操作结构体、Map转化为JSON

    结构体生成Json package main import ( "encoding/json" "fmt" ) type IT struct { Company ...

  4. 初次见识结构体与map的区别

    题目  http://vjudge.net/contest/view.action?cid=51142#problem/G 自己做的结构体 #include <iostream>#incl ...

  5. Map<String,String>转换json字符串

    import java.util.HashMap; import java.util.Map; import net.sf.json.JSONObject; public class testJson ...

  6. 结构体用于map,set时要重载运算符<

    #include<iostream> #include<set> using namespace std; struct P { int entry; int time; bo ...

  7. (三十八)golang--json(对切片、map、结构体进行序列化)

    JSON(javascript object notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成.key-val JSON是在2001年开始推广的数据格式,目前已 ...

  8. Go第六篇之结构体剖析

    Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类型可以被实例化,使用new或&a ...

  9. 06. Go 语言结构体

    Go语言结构体(struct) Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类 ...

随机推荐

  1. go context包的WithTimeout和WithCancel的使用

    1.WaitGroup 它是一种控制并发的方式,它的这种方式是控制多个goroutine同时完成. func main() { var wg sync.WaitGroup wg.Add(2) go f ...

  2. Unix系统编程()main函数的命令行参数

    命令行参数输入双引号是什么效果? 好像可以去空格化.

  3. JVM Specification 9th Edition (4) Chapter 3. Compiling for the Java Virtual Machine

    Chapter 3. Compiling for the Java Virtual Machine 内容列表 3.1. Format of Examples 3.2. Use of Constants ...

  4. python 差分包制作-如何来制作差分包?

    继百度网盘爬虫,百度图片爬虫后这是本人第三篇有关python的文章了,由于本人之前做过嵌入式的一些东西,其中会涉及到差分包的制作,所以这篇文章想谈谈如何利用python来制作差分包,如果你对嵌入式的东 ...

  5. java删除递归文件夹及文件夹下文件

    public static void delUrlLocalFile(String urlPath) { File file = new File(urlPath); if(file.isDirect ...

  6. 用CSS调整scrollbar(滚动条)的配色

    可以通过调整CSS的方式,来给滚动条换色. 代码如下: .uicss-cn{ height:580px;overflow-y: scroll; scrollbar-face-color:#EAEAEA ...

  7. source insight Confirm by typing ‘yes' below"、"has been changed outside of the editor. Do you want to reload the file?"、“

    阅读内核代码习惯和喜欢使用source insight.如果能在source insight上修改内核代码,同时又不需要把修改的内核代码再拷贝到虚拟ubuntu上去那就方便了.于是想通过用samba与 ...

  8. 使用Using的注意事项

    参数传递 C#中有四种参数类型:值类型,Ref参数,Out参数,params参数.默认参数都是以传值方式传递,这意味着方法中的变量会在内存中被分配新的存储空间,并赋值.对于引用类型,这种传值意味着传递 ...

  9. IntelliJ IDEA2017 java连接mysql数据库并查询数据

    最近自己开始重新学习java基础了,做java开发不可避免要处理数据库,由于好久不写java了,对idea也有点陌生了.所以这里写篇用jdbc来连接mysql的文章 至于mysql怎么装,请自行百度  ...

  10. svn服务器配置 for mac

      本文转载至 http://blog.sina.com.cn/s/blog_5e42f31a010156z4.html 1.找到合适的目录,新建一个版本库的目录:mkdir svn 创建版本库:sv ...