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{, "李长全", ""}
result, _ := json.Marshal(user)
fmt.Println(string(result))
}
结果展示

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

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

结果展示

1.3 struct to json

func structToJson() {
user := User{, "李长全", ""}
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 := ; 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{, "李长全", ""}
elem := reflect.ValueOf(&a).Elem()
types := elem.Type()
m := map[string]interface{}{}
for i := ; 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{, "李长全", ""}
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"] = var person User
if err := mapstructure.Decode(mapInstance, &person); err != nil {
fmt.Println(err)
}
fmt.Printf("struct:%v", person)
}

struct,map,json 互相转换的更多相关文章

  1. java中Array/List/Map/Object与Json互相转换详解

    http://blog.csdn.net/xiaomu709421487/article/details/51456705 JSON(JavaScript Object Notation): 是一种轻 ...

  2. json格式转换成Map的应用

    jsp 1.引用json.js(将json格式转换成字符串) 2. var name = document.getElementById("name").value; var re ...

  3. java中Array/List/Map/Object与Json互相转换详解(转载)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Langu ...

  4. [转] golang中struct、json、map互相转化

    一.Json和struct互换 (1)Json转struct例子: type People struct { Name string `json:"name_title"` Age ...

  5. 用jackson包实现json、对象、Map之间的转换

    jackson API的使用 用jackson包实现json.对象.Map之间的转换

  6. 利用阿里巴巴封装的FastJSON来解析json并转换成map

    利用阿里巴巴封装的FastJSON来解析json并转换成map   package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; i ...

  7. java中将数组、对象、Map、List转换成JSON数据

    如果要将数组.对象.Map.List转换成JSON数据,那我们需要一些jar包: json-lib-2.4-jdk15.jar ezmorph-1.0.6.jar commons-logging.ja ...

  8. fastjson在将Map<Integer, String>转换成JSON字符串时,出现中文乱码问题

    fastjson在将Map<Integer, String>转换成JSON字符串时,出现中文乱码问题. 先记下这个坑,改天在看看是怎么导致的,暂时通过避免使用Integer作为键(使用St ...

  9. 使用fastjson的parseObject方法将json字符串转换成Map 或者List

    fastjson 转换成map HashMap<String,String> map = JSON.parseObject(jsonStr,new TypeReference<Has ...

随机推荐

  1. MySQL 还原

    ## sql 还原:mysql -default-character-set=utf8 -h127.0.0.1 -uroot -pxxxxxx test2 < /data/test/db/201 ...

  2. eclipse与idea快捷键对比以及idea debug、git快捷键

    eclipse与idea快捷键 表格中的空格都是忘记了~ 功能 eclipse idea 生成返回值对象 alt+shift+L ctrl+alt+V 找到启动类   ctrl+alt+Home 类的 ...

  3. Django 缓存

    官方文档 缓存的出现就是为了减轻对数据库的压力和加快内存访问的速度.我们的访问请求最终都是返回一个大的字符串,缓存就是将这段字符串直接存储起来,下次你来了,不用经过view去数据库或者内存拿到数据再渲 ...

  4. PS 知识整理

    Ctrl+J键复制背景图层. ps怎样只让截取的一部分图旋转 https://jingyan.baidu.com/article/d45ad14877fc6e69542b8079.html 按Ctrl ...

  5. IIS启动应用程序池报错"服务无法在此时接受控制信息"

    用管理员方式打开命令行 输入命令netsh winsock reset 这个命令在百科上的解释是 netsh winsock reset命令,作用是重置 Winsock 目录.如果一台机器上的Wins ...

  6. git clone失败

    操作: $ git clone https://github.com/zjun615/DragListView.gitCloning into 'DragListView'...fatal: unab ...

  7. eclipse中的web项目部署路径

    elipse添加了server之后,如果不对tomcat的部署路径做更改,则eclipse默认对工程的部署在 eclipse-workspace\.metadata.plugins\org.eclip ...

  8. 《AlwaysRun!团队》第二次作业:团队项目选题报告

    第二次作业:团队项目选题报告 项目  内容  这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/  这个作业的要求在哪里 https://www.cnblog ...

  9. Linux驱动之平台设备驱动模型简析(驱动分离分层概念的建立)

    Linux设备模型的目的:为内核建立一个统一的设备模型,从而有一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要 ...

  10. spring 装配机制

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...