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. C# MessageBox 消息对话框

    在程序中,我们经常使用消息对话框给用户一定的信息提示,如在操作过程中遇到错误或程序异常,经常会使用这种方式给用于以提示.在C#中,MessageBox消息对话框位于System.Windows.For ...

  2. sqoop从hdfs 中导出数据到mysql

    bin/sqoop export \ --connect "jdbc:mysql://mini1:3306/study?useUnicode=true&characterEncodi ...

  3. Zookeeper中的选举机制

    Zookeeper虽然在配置文件中并没有指定master和slave,但是,zookeeper工作时,是有一个节点为leader,其他则为follower.leader是通过内部的选举机制临时产生的. ...

  4. Intellij IDEA和EclipsE之间的的全面对比

    两个IDE之中我最常用的快捷键: 描述 Eclipse IntelliJ 代码补全 Ctrl+space ctrl+space 打开类或者接口 (两个IDE都支持使用"驼峰字符"前 ...

  5. easyui 扩展layout的方法,支持动态添加删除块

    $.extend($.fn.layout.methods, { remove: function(jq, region){ return jq.each(function(){ var panel = ...

  6. Python笔记8:网络编程

    python内置封装了很多常见的网络协议的库,因此python成为了一个强大的网络编程工具,这里是对python的网络方面编程的一个简单描述. urllib 和 urllib2模块 urllib 和u ...

  7. Java WEB 之页面间传递特殊字符

    本文是学习网络上的文章时的总结以及自己的一点实践.感谢大家无私的分享. 昨天在做项目的时候,有一个页面间传递特殊字符的需求,查了一些资料.如今将自己的经验写出来. 首先.在前台编码 var fckPu ...

  8. ARM汇编(2)(指令)

    一,ARM汇编语言立即数的表示方法 十六进制:前缀:0x 十进制:无前缀 二制:前缀:0b 二,常用的ARM指令(标准的ARM语法,GNU的ARM语法) 1.@M开头系列 MOV R0, #12 @R ...

  9. 修改了JS代码,刷新网页后,加载的JS还是原来旧的?

    本地修改JS脚本后,刷新网页看一下修改后的执行效果,结果调试显示加载的JS还是原来旧的,反复刷新均无效,郁闷! 解决办法:清理一下浏览器缓存(长经验了!)     Ctrl+Shift+Del 清除G ...

  10. python入门(五):面向对象

    面向对象术语 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且 ...