不废话了都在代码中了
package main import ( "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的字段名为currentHight Class *Class `class` //指针,指向引用对象;如果不用指针,只是值复制} func doMarshal(){//对象转json字符串 nClass:=new(Class)//new只给给特定类型分配内存,设置“零”值,返回其地址(指针) fmt.Printf("nClass的类型是%s,内容是%v\n",reflect.TypeOf(nClass),*nClass) nClass.Grade=3 nClass.ClassNumber=6 nStudents:=make([]*Student,0) //make只用于map,slice和channel,并且不显示返回指针 //这个切片,存放Student的指针 nStudent:=Student{"Lily",7,116,nClass} jsonBytes,err1:=json.Marshal(nStudent)//解析后的是[]byte if 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/[]Struct student:=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},学生的年龄是0 students:=[]*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,也可以解引用后用.Name fmt.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:=-1 resolve2JosnObj(student1,c) /* *************解析json************* map元素: map[Name]的元素: 类型是string,值是 Lily map[currentHight]的元素: 类型float64,值是 116 map[age]的元素: 类型float64,值是 12 map[Class]的元素: map元素: ---map[classNumber]的元素: 类型float64,值是 6 ---map[grade]的元素: 类型float64,值是 3 map[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:=-1 resolve2JosnObj(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+1 switch 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[],使用对应转换到需要的内容
原网址: 访问
创建于: 2022-09-04 17:09:18
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论