不废话了都在代码中了


package mainimport ("fmt""reflect""encoding/json""strings"
)type Class struct {Grade int `json:"grade"` //年级ClassNumber int  `json:"classNumber"` //班级号
}type Student struct{Name string  //大写开头,可被导出,没有`json:".."`,导出json的字段名是原本名称age int  //小写开题,不可被导出Hight int `json:"currentHight"` //导出对应json的字段名为currentHightClass *Class `class` //指针,指向引用对象;如果不用指针,只是值复制
}func doMarshal(){//对象转json字符串nClass:=new(Class)//new只给给特定类型分配内存,设置“零”值,返回其地址(指针)fmt.Printf("nClass的类型是%s,内容是%v\n",reflect.TypeOf(nClass),*nClass)nClass.Grade=3nClass.ClassNumber=6nStudents:=make([]*Student,0)//make只用于map,slice和channel,并且不显示返回指针//这个切片,存放Student的指针nStudent:=Student{"Lily",7,116,nClass}jsonBytes,err1:=json.Marshal(nStudent)//解析后的是[]byteif err1!=nil{fmt.Printf("转json失败:%v\n",err1)return}fmt.Println("转成的JSON:") //age不会被导出//{"Name":"Lily","currentHight":116,"Class":{"grade":3,"classNumber":6}}fmt.Println(string(jsonBytes))nStudents=append(nStudents,&Student{"Lilei",8,130,nClass})nStudents=append(nStudents,&nStudent)josnListBytes,err2:=json.Marshal(nStudents)if err2!=nil{fmt.Printf("转jsonList失败:%v\n",err2)return}fmt.Println("转成的列表型JSON:")fmt.Println(string(josnListBytes))//[{"Name":"Lilei","currentHight":130,"Class":{"grade":3,"classNumber":6}},{"Name":"Lily","currentHight":116,"Class":{"grade":3,"classNumber":6}}]
}func doUnMarshal(){//json字符串转对象jsonStr:=`{"Name":"Lily","currentHight":116,"age":12,"Class":{"grade":3,"classNumber":6},"score":[98,100,95]}`jsonListStr:=`[{"Name":"Lucy","currentHight":120,"Class":{"grade":3,"classNumber":5}},{"Name":"Lily","currentHight":116,"Class":{"grade":3,"classNumber":6}}]`//第一种解析json方式,解析到Struct/[]Structstudent:=Student{}//同new(Student)err:=json.Unmarshal([]byte(jsonStr),&student)//Unmarshall第2个参数必须是指针,否则报错:json: Unmarshal(non-pointer main.Student)//因为必须解析到具体的对象,所以需传入对象引用,而不是值传递//score在Student中没有此字段,所以被忽略了if err!=nil{fmt.Printf("解析json字符串异常:%s\n",err)}fmt.Printf("学生的名称是%v,班级信息是%v,年龄是%v(私有对象不能导入,初始为0)\n",student.Name,*student.Class,student.age)//学生的名称是Lily,学生的班级信息是{3 6},学生的年龄是0students:=[]*Student{} //定义切片,同make([]*Student,0)err=json.Unmarshal([]byte(jsonListStr),&students)if err!=nil{fmt.Printf("解析json字符串异常:%s\n",err)}for _,stu:=range students{ //这里stu是指针类型,获取其属性可以直接用.Name,也可以解引用后用.Namefmt.Printf("列表:学生的名称是%s,身高是%d,在%d年级%d班\n",stu.Name,(*stu).Hight,(*stu.Class).Grade,stu.Class.ClassNumber)}//第二种解析到interface{}/[]interface{}fmt.Println("*************解析json*************")var student1 interface{}err=json.Unmarshal([]byte(jsonStr),&student1)if err!=nil{fmt.Printf("解析json字符串异常:%s\n",err)}c:=-1resolve2JosnObj(student1,c)/**************解析json*************map元素:map[Name]的元素: 类型是string,值是 Lilymap[currentHight]的元素: 类型float64,值是 116map[age]的元素: 类型float64,值是 12map[Class]的元素: map元素:---map[classNumber]的元素: 类型float64,值是 6---map[grade]的元素: 类型float64,值是 3map[score]的元素: list元素:---第0个元素: 类型float64,值是 98---第1个元素: 类型float64,值是 100---第2个元素: 类型float64,值是 95*/fmt.Println("*************解析jsonlist*************")var students1 interface{}err=json.Unmarshal([]byte(jsonListStr),&students1)if err!=nil{fmt.Printf("解析jsonlist字符串异常:%s\n",err)}d:=-1resolve2JosnObj(students1,d)/**************解析jsonlist*************list元素:第0个元素: map元素:---map[Name]的元素: 类型是string,值是 Lucy---map[currentHight]的元素: 类型float64,值是 120---map[Class]的元素: map元素:------map[grade]的元素: 类型float64,值是 3------map[classNumber]的元素: 类型float64,值是 5第1个元素: map元素:---map[Class]的元素: map元素:------map[grade]的元素: 类型float64,值是 3------map[classNumber]的元素: 类型float64,值是 6---map[Name]的元素: 类型是string,值是 Lily---map[currentHight]的元素: 类型float64,值是 116*/
}func resolve2JosnObj(objI interface{},c int){c=c+1switch obj:=objI.(type) { //此处[interface{}].(type) 专门用于switch的类型判断case string:fmt.Println("类型是string,值是",obj)case float64:fmt.Println("类型float64,值是",obj)case map[string]interface{}:fmt.Println("map元素:")for k,vi:=range obj{fmt.Printf("%smap[%s]的元素: ",strings.Repeat("---",c),k)resolve2JosnObj(vi,c)}case []interface{}:fmt.Println("list元素:")for i,vi:=range obj{fmt.Printf("%s第%d个元素: ",strings.Repeat("---",c),i)resolve2JosnObj(vi,c)}default:fmt.Println("无法判断类型,类型是",reflect.TypeOf(obj),"值是",obj)}}func main() {doMarshal()//对象转json字符串doUnMarshal()
}

简单总结

1、结构体对象可生成json字符串,Marshal()是[]byte,需要string去转换
2、json字符串可以映射到一个struct,但仅限公共元素(大写开头);也可通用的转换到空接口interfece[],使用对应转换到需要的内容

Go实现json字符串与各类struct相互转换相关推荐

  1. c#谷歌 json转对象_利用Google Gson实现JSON字符串和对象之间相互转换

    最近一个项目需要用到JSON,需要在JSON字符串和对象之间相互转换,在网上找了些资料,发现google的Gson还是比较不错的. 废话不说,下面是简单的例子: 先上源码:下载(包含jar包) Per ...

  2. JS解析json数据(json字符串和数组之间相互转换)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

  3. json对象、json字符串的区别和相互转换

    开发时,json字符串和json对象傻傻分不清楚,ajax异步请求后,会根据返回的data值判断请求是否成功,访问data.msg会提示'undefined',将data转换为json对象即可. 一. ...

  4. json字符串与对象如何相互转换

    把JSON格式转成对象:JSON.parse() 把对象转成标准json:JSON.stringify() 使用eval能够把字符串尽量转成js运行的代码 eval('(' + jsonstr + ' ...

  5. php 获取 js json数据类型,JS基础-JS的数据类型和访问/流程控制/JSON格式字符串和js对象相互转换...

    JS的数据类型和访问/流程控制/JSON格式字符串和js对象相互转换 1. JS的数据类型和访问 1.1. 原始类型JS中的原始数据类型有: number , string , boolean ; 声 ...

  6. 使用jackson对Java对象与JSON字符串相互转换的一些总结

    总结一下自己使用 jackson 处理对象与 JSON 之间相互转换的心得. jackson 是一个用 Java 编写的,用来处理 JSON 格式数据的类库,它速度非常快,目前来看使用很广泛,逐渐替代 ...

  7. Go语言编程—Go语言中JSON的处理(map、struct 和 JSON字符串的相互转换)

    JSON的简单介绍 JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成.尽管JSON是JavaSc ...

  8. Gson案例:Java对象与JSON字符串相互转换

    Gson案例:Java对象与JSON字符串相互转换 一.Gson概述 Gson是一个Java类库,可将Java对象转换为相应的JSON形式,也可以将JSON字符串转换为对应的Java对象.Gson是一 ...

  9. 下划线JSON字符串与驼峰Java Bean相互转换

    下划线JSON字符串与驼峰Java Bean相互转换 1.实体类 package com.example.springboottest.domain;/*** @author mac* @title: ...

最新文章

  1. 注入式开发(二):.NET 匿名函数
  2. python3 dict 字典 转 严格 json
  3. 多线程中的队列不一定需要线程安全
  4. 改变世界,改善生活:我从科沃斯扫地机器人X1,看到了AI新的希望
  5. 电商后台原型 rp_电商选型:一站式线上商城的重要性
  6. 类 kotlin(13)
  7. 【Oracle】ORA-30042: Cannot offline the undo tablespace
  8. mysql 查询的关键词的执行顺序
  9. 一起谈.NET技术,NET下RabbitMQ实践 [配置篇]
  10. 【深度学习】PyCorrector中文文本纠错实战
  11. 知道创宇获CNNVD年度优秀技术支撑单位及漏洞预警报送专项奖
  12. 计算机基础知识500字以上,计算机心得体会500字(精选6篇)
  13. 30分钟了解DNS及搭建方法
  14. 使用OBS屏幕录制时色彩错误问题解决方案
  15. android银河城游戏,Endless Memories安卓版
  16. 嵌入式Linux容器技术
  17. 赶紧来修炼内功发~内存函数详解大全-memcpy、memmove、memcmp
  18. 谷歌 ARCore 就是低配版 Tango,它比苹果 ARKit 好在哪?
  19. (3) openssl genrsa(生成rsa私钥)
  20. Flex4/Flash开发在线音乐播放器 , 含演示地址

热门文章

  1. python工作流引擎_工作流,活动图和Python协程(一)
  2. 后发习得数据 机器学习_第1章 机器学习理论简述
  3. Photoshop把杂乱的人像图片简化处理
  4. 如何用python画函数曲线_python 画函数曲线示例 用python 怎么画函数图像
  5. 适用于一切模型的决策曲线分析DCA
  6. hive面试题——求连续活跃天数
  7. bs84c12引脚_最新BS84B12A-3.pdf
  8. 魔兽争霸微操地图的使用
  9. esxi显卡给2个虚拟机_利用ESXi实现一拖二和各系统独立运行——基础篇
  10. 程序设计思维 week9 作业B-东东学打牌