腐汝
随笔 - 168 文章 - 0 评论 - 2 阅读 - 89497
golang json字符串转结构体
1、不知道结构体类型的情况下
func JsonStringToMap(jsonStr string) (map[string]interface{}, error) { //未知值类型 m := make(map[string]interface{}) err := json.Unmarshal([]byte(jsonStr), &m) if err != nil { fmt.Printf("Unmarshal with error: %+v\n", err) return nil, err } return m, nil } res := JsonStringToMap(response.ToJsonString()) resp, ok := res["Response"].(map[string]interface{}) if ok { for _, v := range resp["Machines"].([]interface {}){ fmt.Println(v.(map[string]interface{})["Ip"]) fmt.Println(v.(map[string]interface{})["Status"]) } }
慢慢断言拆数据,属实很麻烦。
2、在知道结构体类型的情况下
func JsonStringToMap_v2(jsonStr string) { //未知值类型 var dmrp cls.DescribeMachinesResponse err := json.Unmarshal([]byte(jsonStr), &dmrp) if err != nil { fmt.Printf("Unmarshal with error: %+v\n", err) } for _,v := range dmrp.Response.Machines { fmt.Println(*v.Ip) fmt.Println(*dmrp.Response.AutoUpdate) } }
相对方便多了。
3、刚开始找了第一种办法,感觉太麻烦,之后发现第二种办法,用了第二种办法后发现在函数的返回类型里面直接可以使用未转成json串之前的数据结构,不熟悉的代价就是花时间折腾。
小例子
一个通用的结构体,不管来源的类型,Data里面包含的是各种数据类型。当interface里面是一个map时,想知道map中对应的value,需要多层断言,先断出Data,获取到Data的数据后,再断process_name和identify_pid。
package main import ( "encoding/json" "fmt" ) type TransmittedData struct { Data interface{} `json:"data"` Scene string `json:"scene"` } func main() { postData := []byte(` { "data": { "process_name": "serverMetricExtend", "identify_pid": "ps -ef|grep serverMetricE|grep -v grep |awk '{print $2}'" }, "scene": "process_monitor" } `) var transmittedData TransmittedData err := json.Unmarshal(postData, &transmittedData) if err != nil { fmt.Println("Error:", err) return } data, ok := transmittedData.Data.(map[string]interface{}) if !ok { fmt.Println("Error: Data is not a map") return } processName, ok := data["process_name"].(string) if !ok { fmt.Println("Error: Process Name is not a string") return } identifyPid, ok := data["identify_pid"].(string) if !ok { fmt.Println("Error: Identify PID is not a string") return } fmt.Println("Process Name:", processName) fmt.Println("Identify PID:", identifyPid) fmt.Println("Scene:", transmittedData.Scene) }
分类: go 好文要顶 关注我 收藏该文 微信分享 腐汝
粉丝 - 4 关注 - 2 +加关注 0 0 « 上一篇: System is booting up. See pam_nologin(8)
» 下一篇: prometheus的sdk client_golang 使用 定时器 posted @ 2023-08-02 18:06 腐汝 阅读(351) 评论(0) 编辑 收藏 举报 会员力量,点亮园子希望 刷新页面返回顶部 登录后才能查看或发表评论,立即 登录 或者 逛逛 博客园首页 【推荐】这场阿里云开发者社区有奖征文活动,期待您出文相助
【推荐】三生石上:ASP.NET Core中运行WebForms业务代码
【推荐】「指间灵动,快码加编」:通义灵码,再次降临博客园
【推荐】凡泰极客:跨越技术“鸿”沟,小程序一键生成鸿蒙App
【推荐】阿里云创新加速季,5亿补贴享不停,上云礼包抢先领 编辑推荐:
· 老生常谈!程序员为什么要阅读源代码?
· 如何安全地访问互联网
· 还在拼冗长的 WhereIf 吗?100行代码解放这个操作
· C#异步编程是怎么回事(番外)
· [WPF]Dispatcher 与消息循环 阅读排行:
· 「指间灵动,快码加编」:阿里云通义灵码,再次降临博客园
· 面试官:你讲下接口防重放如何处理?
· 如何安全地访问互联网
· 手机上玩 PC 游戏的开源项目「GitHub 热点速览」
· 【译】Visual Studio 17.10 发布了新版扩展管理器
公告
昵称: 腐汝园龄: 8年
粉丝: 4
关注: 2 +加关注
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
26 | 27 | 28 | 29 | 30 | 31 | 1 | |||
2 | 3 | 4 | 5 | 6 | 7 | 8 | |||
9 | 10 | 11 | 12 | 13 | 14 | 15 | |||
16 | 17 | 18 | 19 | 20 | 21 | 22 | |||
23 | 24 | 25 | 26 | 27 | 28 | 29 | |||
30 | 1 | 2 | 3 | 4 | 5 | 6 |
搜索
常用链接
最新随笔
- 1.当我遇到了爬虫
- 2.容器网络
- 3.simpleui layer 自动更新数据并且在migrate时layer不自动加载
- 4.crontab 环境变量的问题
- 5.simple ui 自定义用户权限菜单
- 6.k8s kubeadm扩容指定版本节点
- 7.Django NoReverseMatch
- 8.python的单例模式
- 9.prometheus的sdk client_golang 使用 定时器
- 10.golang json字符串转结构体
我的标签
- python(8)
- html(4)
- web框架基础(1)
- ubuntu(1)
- mysql源码安装(1)
- javascript(1)
- http(1)
- gitlab源码搭建(1)
- gitlab-runner(1)
- gitlab(1)
- 更多
积分与排名
- 积分 - 75662
- 排名 - 20828
随笔分类
- dba(15)
- devops(25)
- django(8)
- docker(1)
- elk(3)
- go(2)
- html(4)
- istio(8)
- k8s(10)
- lua(1)
- prometheus(4)
- python(33)
- simpleui(2)
- system(40)
随笔档案
- 2024年6月(1)
- 2024年2月(1)
- 2024年1月(2)
- 2023年12月(1)
- 2023年10月(1)
- 2023年9月(1)
- 2023年8月(3)
- 2023年7月(1)
- 2023年6月(3)
- 2023年5月(2)
- 2023年4月(3)
- 2023年3月(4)
- 2023年2月(2)
- 2023年1月(2)
- 2022年11月(1)
- 更多
阅读排行榜
- 1. mysql binlog日志的三种模式(8611)
- 2. rsync+sersync多线程实时同步(8028)
- 3. DNS(bind)添加A、CNAME、MX、PTR记录、智能DNS(ACL)(5906)
- 4. 基于docker的gitlab+gitlabrunner+ansible自动部署(3503)
- 5. mysql如果主库宕机,如何解决?(3048)
推荐排行榜
- 1. mysql binlog日志的三种模式(2)
- 2. filebeat更改mapping 字段类型(1)
- 3. kubeadm init问题(1)
- 4. mysql的两种常用的引擎(1)
- 5. mysql增量恢复的一个实例操作(1)
最新评论
- 1. Re:关于python2.7从数据库读取中文显示乱码的问题解决
- @ 牛腩谢谢大佬支持...
- 2. Re:关于python2.7从数据库读取中文显示乱码的问题解决
- 支持支持
Powered by .NET 8.0 on Kubernetes 标签:string,err,fmt,golang,Println,json,2023,字符串 From: https://www.cnblogs.com/cheyunhua/p/18243245