博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struct,map,json 互相转换
阅读量:5009 次
发布时间:2019-06-12

本文共 2462 字,大约阅读时间需要 8 分钟。

1.1 struct to json 准备

  很简单,使用encoding包可以互相转换,没什么好说的,但是有几点注意:

1.结构体内需要序列化的字段首字母大写(遵循驼峰式命名),不需要序列化的字段小写无所谓了

Username string `json:"username"` 将会使用username做json key值

2.如果需要序列化后的json key格式小写,需要加上json标签 

`json:"password"`

3.json标签内,首字符如果是逗号,将使用字段输出,json标签内的指定key将自动忽略

`json:",password"`  加上逗号

4.如果需要忽略json输出,可以在json标签内,使用 '-',横线作忽略标记

`json:"-"` 作忽略

1.2结构体转json

func structToJson() {    user := User{
5, "李长全", "1234"} result, _ := json.Marshal(user) fmt.Println(string(result))}
结果展示

这种方式输出的json,是一行展示,一般测试的时候,我会这样输出,方便做字符串比较,但是如果调试的时候,我习惯换一种方式,输出的是json格式化之后的字符串,这样就不用json工具做转换了

func structToJson() {    user := User{
5, "李长全", "1234"} result, _ := json.MarshalIndent(user, "", " ") fmt.Println(string(result))}

结果展示

1.3 struct to json

func structToJson() {    user := User{
5, "李长全", "1234"} result, _ := json.MarshalIndent(user, "", " ") u := &User{} json.Unmarshal(result, u) fmt.Printf("%+v\n", u)}

2.1struct转map

 

func Struct2Map(obj interface{}) map[string]interface{} {    t := reflect.TypeOf(obj)  //使用反射,k根据typeof拿到field    v := reflect.ValueOf(obj) //v根据valueof拿到interface    var data = make(map[string]interface{})    for i := 0; i < t.NumField(); i++ {        data[t.Field(i).Name] = v.Field(i).Interface()    }    return data}

 通过反射,拿到属性和值,属性做key,值做value,存储到map中,使用typeOf和valueOf,但是我当然是不喜欢了,我喜欢下面这种方式,使用valueOf就可以解决的问题,为啥非要多一步typeof

关于typeOf和valueOf,等我写反射的时候,再详细说

2.2反射第二种方式

func structToMap() {    a := User{
1, "李长全", "1234"} elem := reflect.ValueOf(&a).Elem() types := elem.Type() m := map[string]interface{}{} for i := 0; i < types.NumField(); i++ { m[types.Field(i).Name] = elem.Field(i).Interface() }}

当然了,方法还有,结构转json,都会了,map转json也是一样的,那很简单了,通过json做中间转换一下啊, (a=b知道了,  b=c知道了  如何求ac,通过b转换啊)

2.3通过json转换

func structToEndMap() {    t := time.Now()    m := make(map[string]interface{})    user := User{
5, "李长全", "1234"} j, _ := json.Marshal(user) json.Unmarshal(j, &m) fmt.Println(m) fmt.Printf("duration:%d", time.Now().Sub(t))}

3.map转结构


  map转结构,我看到一种写法使用第三方包,这个包叫mapstruct,只有decode方法,找半天,没找到encode,这么low么,我是不信的,只能map转成结构,结构无法回转吗,我是拒绝的

func MapToStruct() {    mapInstance := make(map[string]interface{})    mapInstance["name"] = "lcq"    mapInstance["age"] = 28    var person User    if err := mapstructure.Decode(mapInstance, &person); err != nil {        fmt.Println(err)    }    fmt.Printf("struct:%v", person)}

 

转载于:https://www.cnblogs.com/quanting112037/p/10484022.html

你可能感兴趣的文章
Mybatis 数据库物理分页插件 PageHelper
查看>>
虚函数、纯虚函数详解
查看>>
z-stack中数据的发送,广播、组播、点对点
查看>>
Practial Vim 学习笔记一
查看>>
.NET中使用js实现百度搜索下拉提示效果[不是局部刷新,呜呜。。]
查看>>
ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP入门)
查看>>
关于二维码“QR”的6大注意事项
查看>>
MySQL - 常用命令及常用查询SQL
查看>>
C# .NET MVC 接收 JSON ,POST,WCF 无缝隙切换
查看>>
android获取USB设备的名称
查看>>
JavaPersistenceWithHibernate第二版笔记-第七章-005排序的集合(@org.hibernate.annotations.SortComparator)...
查看>>
ue4同c#通信时的中文乱码问题
查看>>
黄老师架构师课程笔记(二)
查看>>
mvc性能优化
查看>>
log
查看>>
663 如何做“低端”产品?(如何把低端做得高端 - 认同感)
查看>>
JDBC 第九课 —— 初次接触 JUnit
查看>>
Windows核心编程:第10章 同步设备IO与异步设备IO
查看>>
浏览器加载、解析、渲染的过程
查看>>
开放api接口签名验证
查看>>