golang json字符串转结构体
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) }
posted @ 2023-08-02 18:06 腐汝 阅读(45
【推荐】三生石上:ASP.NET Core中运行WebForms业务代码
【推荐】「指间灵动,快码加编」:通义灵码,再次降临博客园
【推荐】凡泰极客:跨越技术“鸿”沟,小程序一键生成鸿蒙App
【推荐】阿里云创新加速季,5亿补贴享不停,上云礼包抢先领
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2023-06-12 ELK分析Nginx日志和可视化展示
2023-06-12 SRE传道,如何解决系统报错:nf_conntrack: table full, dropping packets
2023-06-12 MySQL闪回工具简介 及 binlog2sql工具用法
2023-06-12 MySQL8.0轻松搞定GTID主从复制
2023-06-12 MySql5.7主从同步配置(gtid模式)
2023-06-12 Golang 应用脚手架
2021-06-12 【MySQL】通过Percona Monitoring and Management实现数据库的监控