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. vue 单文件组件

    在很多vue项目中,我们使用vue.component来定义全局组件,紧接着用new Vue({el:'#container'})在每个页面内指定一个容器元素 这种方式在很多中小规模的项目中运作的很好 ...

  2. HTML5之语音识别实例

    HTML5之语音识别实例 代码 <input type="text"  x-webkit-speech id="d1" lang="zh-CN& ...

  3. linux学习笔记22--命令ln

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...

  4. docker构建测试环境

    构建测试环境首先要根据自己的需求,构建出适合自己项目的image,有了自己的image,就可以快速的搭建出来一套测试环境了. 下边就说一下构建image的两种方式. 1.DOCKFILE创建文件夹:m ...

  5. 推广Facebook技巧

    1.创建有吸引力的内容发布多样化的内容,包括图片,状态更新,视频,投票等.可以问你的粉丝一些问题让他们提供答案.这些内容不仅你的粉丝可以看到,它们还将会出现在你粉丝的个人动态栏,所以他们的朋友也是可以 ...

  6. elasticsearch插件三—— Marvel插件安装详解

    2016年05月21日 22:58:13 阅读数:23058 一.Marvel插件介绍 Marvel插件:在簇中从每个节点汇集数据.这个插件必须每个节点都得安装. Marvel是Elasticsear ...

  7. win7(64位)+vs2008配置Directshow

    参考链接:http://zhuyanfeng.com/archives/1663 PC环境:win7 64bit + vs2008 1.下载64位的win7 SDK2.安装过程中遇到错误(必须要卸载v ...

  8. ASP.NET实现推送文件到浏览器的方法

    这篇文章主要介绍了ASP.NET实现推送文件到浏览器的方法,可实现将文件推送到浏览器供用户浏览或下载的功能,需要的朋友可以参考下 本文实例讲述了ASP.NET实现推送文件到浏览器的方法.分享给大家供大 ...

  9. 爬虫实战【9】Selenium解析淘宝宝贝-获取宝贝信息并保存

    通过昨天的分析,我们已经能到依次打开多个页面了,接下来就是获取每个页面上宝贝的信息了. 分析页面宝贝信息 [插入图片,宝贝信息各项内容] 从图片上看,每个宝贝有如下信息:price,title,url ...

  10. mybatis循环map

    一.循环key <foreach collection="map.keys" item="key" separator="and"&g ...