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. eclipse导入svn中的maven工程项目

    Eclipse导入现有的maven工程 第一步:右键如图 new->other 进入other->输入svn->从svn检索项目,如图 点击next>如下图,如是第一次则选择创 ...

  2. linux常用命令系列

    自己开始接触linux系统已经两年了,刚到现场进行系统维护的时候,只知道ls和cd命令,所以我被迫开始学习linux,虽然现在每天都在linux系统上进行一些操作,但是感觉自己半路出家一样:可能知道某 ...

  3. 记centos 安装 mysql5.7.23.tar.gz教程

    1.下载tar包,这里使用wget从官网下载 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2. ...

  4. mui调用webservice

    document.getElementById("confirm").addEventListener('tap', function() {var respnoseEl = do ...

  5. Storm系统架构以及代码结构学习

    转自:http://blog.csdn.net/androidlushangderen/article/details/45955833 storm学习系列:http://blog.csdn.net/ ...

  6. 在java语言中int 和 Integer 有什么区别

    在java语言中int 和 Integer 有什么区别 解答:int是基本数据类型,Integer是int的包装类,属于引用类型

  7. 请写出一段表单提交的HTML代码,表单名称为form1,提交方式为post,提交地址为submit.asp

    请写出一段表单提交的HTML代码,表单名称为form1,提交方式为post,提交地址为submit.asp 解答: <form name=”form1” method=”post” action ...

  8. ASP.NET动态增加HTML元素的方法实例小结

    本文实例讲述了ASP.NET动态增加HTML元素的方法.分享给大家供大家参考,具体如下: 在使用asp.net进行web开发的时候页面中的<head></head>中的信息可以 ...

  9. caffe 网络参数设置

    weight_decay防止过拟合的参数,使用方式: 样本越多,该值越小 模型参数越多,该值越大 一般建议值: weight_decay: 0.0005 lr_mult, decay_mult 关于偏 ...

  10. OpenCV 常用汇总

    cv::Rect矩形类用法 typedef struct CvRect { int x; /* 方形的左上角的x-坐标 */ int y; /* 方形的左上角的y-坐标*/ int width; /* ...