1. golang 中 json 转 struct

  <1. 使用 json.Unmarshal 时,结构体的每一项必须是导出项(import field)。也就是说结构体的 key 对应的首字母必须为大写。请看下面的例子:

package commontest

import (
"testing"
"encoding/json"
) type Person struct {
name string
age int
} func TestStruct2Json(t *testing.T) {
jsonStr := `
{
"name":"liangyongxing",
"age":
}
`
var person Person
json.Unmarshal([]byte(jsonStr), &person)
t.Log(person)
}

输出的结果如下:

{ 0}

  从结果可以看出,json 数据并没有写入 Person 结构体中。结构体 key 首字母大写的话就可以,修改后:

package commontest

import (
"testing"
"encoding/json"
) type Person struct {
Name string
Age int
} func TestStruct2Json(t *testing.T) {
jsonStr := `
{
"name":"liangyongxing",
"age":
}
`
var person Person
json.Unmarshal([]byte(jsonStr), &person)
t.Log(person)
}

打印结果如下:

{liangyongxing 12}

  从以上结果我们可以发现一个很重要的信息,json 里面的 key 和 struct 里面的 key 一个是小写一个是大写,即两者大小写并没有对上。从这里我们就可以得出一个结论,要想能够附上值需要结构体中的变量名首字母大写,而在转换的 json 串中大小写都可以,即在 json 传中字段名称大小写不敏感。那么经过验证发现,在 json 中如果写成如下方式:

jsonStr := `
{
"NaMe":"liangyongxing",
"agE":
}
`

  最终结果仍然是有值的,那么就验证了我们上面的结论,json 串中对字段名大小写不敏感(不一定是首字母,这点需要注意)

  <2. 在结构体中是可以引入 tag 标签的,这样在匹配的时候 json 串对应的字段名需要与 tag 标签中定义的字段名匹配,当然在 tag 中定义的名称就不需要首字母大写了,且对应的 json 串中字段名称仍然大小写不敏感,和上面的结论一致。(注意:此时结构体中对应的字段名可以不用和匹配的一致,但是也必须首字母大写,只有大写的才是可对外提供访问的)

package commontest

import (
"testing"
"encoding/json"
) //这里对应的 N 和 A 不能为小写,首字母必须为大写,这样才可对外提供访问,具体 json 匹配是通过后面的 tag 标签进行匹配的,与 N 和 A 没有关系
//tag 标签中 json 后面跟着的是字段名称,都是字符串类型,要求必须加上双引号,否则 golang 是无法识别它的类型
type Person struct {
N string `json:"name"`
A int `json:"age"`
} func TestStruct2Json(t *testing.T) {
jsonStr := `
{
"name":"liangyongxing",
"age":
}
`
var person Person
json.Unmarshal([]byte(jsonStr), &person)
t.Log(person)
}

这样输出的结果如下:

{liangyongxing 12}

  当然,你也可以再做一个实验,验证 tag 标签中对应的字段名称大小写不敏感,这里就不做冗余介绍了。

2. golang 中 struct 转 json 串

 package commontest

 import (
"testing"
"encoding/json"
) func TestStruct2Json(t *testing.T) {
p := Person{
Name: "liangyongxing",
Age: ,
} t.Logf("Person 结构体打印结果:%v", p) //Person 结构体转换为对应的 Json
jsonBytes, err := json.Marshal(p)
if err != nil {
t.Fatal(err)
}
t.Logf("转换为 json 串打印结果:%s", string(jsonBytes))
}

打印结果如下所示:

/usr/local/go/bin/go test -v commontest -run ^TestStruct2Json$
struct2json_test.go:14: Person 结构体打印结果:{liangyongxing 29}
struct2json_test.go:21: 转换为 json 串打印结果:{"name":"liangyongxing","age":29}
ok commontest 0.006s

3. golang 中 json 转 map

package commontest

import (
"testing"
"encoding/json"
) func TestJson2Map(t *testing.T) {
jsonStr := `
{
"name":"liangyongxing",
"age":
}
`
var mapResult map[string]interface{}
//使用 json.Unmarshal(data []byte, v interface{})进行转换,返回 error 信息
if err := json.Unmarshal([]byte(jsonStr), &mapResult); err != nil {
t.Fatal(err)
}
t.Log(mapResult)
}

打印结果信息如下:

/usr/local/go/bin/go test -v commontest -run ^TestJson2Map$
json2map_test.go:19: map[name:liangyongxing age:12]
ok commontest 0.007s

4. golang 中 map 转 json 串

package commontest

import (
"testing"
"encoding/json"
) func TestMap2Json(t *testing.T) {
mapInstance := make(map[string]interface{})
mapInstance["Name"] = "liang637210"
mapInstance["Age"] =
mapInstance["Address"] = "北京昌平区" jsonStr, err := json.Marshal(mapInstance) if err != nil {
t.Fatal(err)
} t.Logf("Map2Json 得到 json 字符串内容:%s", jsonStr)
}

打印结果如下:

/usr/local/go/bin/go test -v commontest -run ^TestMap2Json$
map2json_test.go:20: Map2Json 得到 json 字符串内容:{"Address":"北京昌平区","Age":28,"Name":"liang637210"}
ok commontest 0.008s

5. golang 中 map 转 struct

  这个转换网上有比较完整的项目,已经上传到对应的 github 上了,需要下载之后使用:

  $ go get github.com/goinggo/mapstructure

  之后我们就可以直接使用它提供的方法将 map 转换为 struct,让我们直接上代码吧

package commontest

import (
"testing"
"github.com/goinggo/mapstructure"
) func TestMap2Struct(t *testing.T) {
mapInstance := make(map[string]interface{})
mapInstance["Name"] = "liang637210"
mapInstance["Age"] = var person Person
//将 map 转换为指定的结构体
if err := mapstructure.Decode(mapInstance, &person); err != nil {
t.Fatal(err)
}
t.Logf("map2struct后得到的 struct 内容为:%v", person)
}

打印结果如下:

/usr/local/go/bin/go test -v commontest -run ^TestMap2Struct$
map2struct_test.go:18: map2struct后得到的 struct 内容为:{liang637210 28}
ok commontest 0.009s

6. golang 中 struct 转 map

 package commontest

 import (
"testing"
"reflect"
) type User struct {
Id int `json:"id"`
Username string `json:"username"`
Password string `json:"password"`
} func Struct2Map(obj interface{}) map[string]interface{} {
t := reflect.TypeOf(obj)
v := reflect.ValueOf(obj) var data = make(map[string]interface{})
for i := ; i < t.NumField(); i++ {
data[t.Field(i).Name] = v.Field(i).Interface()
}
return data
} func TestStruct2Map(t *testing.T) {
user := User{, "zhangsan", "password"}
data := Struct2Map(user)
t.Logf("struct2map得到的map内容为:%v", data)
}

打印结果如下:

/usr/local/go/bin/go test -v commontest -run ^TestStruct2Map$
struct2map_test.go:28: struct2map得到的map内容为:map[Id:5 Username:zhangsan Password:password]
ok commontest 0.007s

Go_14:GoLang中 json、map、struct 之间的相互转化的更多相关文章

  1. GoLang中 json、map、struct 之间的相互转化

    1. golang 中 json 转 struct <1. 使用 json.Unmarshal 时,结构体的每一项必须是导出项(import field).也就是说结构体的 key 对应的首字母 ...

  2. golang中json包序列化与反序列化

    package main import ( "encoding/json" "fmt" "reflect" ) type Info stru ...

  3. golang中string以及slice之间的一些问题

    好记性不如烂笔头o_O slice切片不会开辟新的空间 a := []int{0,1,2,3} b := make([]int, 8) b = a[:] b[2] = 9 fmt.Println(a) ...

  4. python中json与dict之间转换

    Python之dict(或对象)与json之间的互相转化 在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作. 在Python中自带json库.通过import js ...

  5. golang中,map作为函数参数是如何传递的

    当你声明一个map的时候: m := make(map[int]int) 编译器会调用 runtime.makemap: // makemap implements a Go map creation ...

  6. map json 字符串 对象之间的相互转化

    1.对象与字符串之间的互转 将对象转换成为字符串 String str = JSON.toJSONString(infoDo); 字符串转换成为对象 InfoDo infoDo = JSON.pars ...

  7. Golang中的Map(集合)

    Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值. Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它.不过,Map 是无 ...

  8. golang中json格式化自定义日期格式

    go 的time.Time,在json序列化是默认 2006-01-02T15:04:05Z07:00 的格式,十分不便, encoding/json包在序列化和反序列化的时候分别调用encode.g ...

  9. golang中的map

    1. 声明与初始化 // map的声明与初始化 userInfo := map[string]string{"name": "马亚南", "age&q ...

随机推荐

  1. go语言学习-接口

    Go语言中虽然没有传统面向对象语言中类.集成的概念,不过提供了接口的支持,可以使用接口来使用一些面向对象的特性. 在 go 语言中,的接口有下面几个特点: 可以包含0个或多个方法的签名 只定义方法的签 ...

  2. 618大促微服务、web、redis等的超时时间

    1. 最近因为大促原因线上服务不稳定,不稳定主要是redis经常超时并且数据为定时mGet方式获得 节点一多,所有服务节点同时获取数据访问量变大导致get取数据变慢因mGet会对数据进行锁住操作, 此 ...

  3. 洛谷.U19464.山村游行wander(LCT 伪期望)

    题目链接 题意: 森林,动态建边.删边,询问从S开始走到T的期望时间.走位: 每次人会随机地选一条未走过的边走,走到无路可走,再退回.这样直到终点T.走一条边.从一条边退回都花费时间1. 题目特点是走 ...

  4. php curl请求https 返回无结果|false|errno:35

    1 SSL: certificate subject name 'WMSvc-GWAMSERVER02' does not match target host name 把curl_setopt($c ...

  5. centos7环境下对防火墙的操作

    我是运行了systemctl stop firewalld.service && systemctl disabl e firewalld.service命令于是显示 [root@in ...

  6. 彻底放弃没落的MFC,对新人的忠告! by FreeWick

    完全没想到10多年后还有人纠结要不要学MFC,我花点时间给新人们一个总结. 第1种观点 学习完MFC,你会更理解编程的思想,再学别的语言就更快了. 话说小白要去美国学技术,大黑劝他说:“你为什么不先到 ...

  7. Android的Databinding-自定义生成类名字

    1. 在xml中,添加class的属性并设置为自定义名字<data class="com.example.CustomBinding"></data>2. ...

  8. java线程安全之并发Queue

    关闭 原 java线程安全之并发Queue(十三) 2017年11月19日 23:40:23 小彬彬~ 阅读数:12092更多 所属专栏: 线程安全    版权声明:本文为博主原创文章,未经博主允许不 ...

  9. Java 面试题 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  10. 基于php5.5使用PHPMailer-5.2发送邮件

    PHPMailer - A full-featured email creation and transfer class for PHP. 在PHP环境中可以使用PHPMailer来创建和发送邮件. ...