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)
}
分类: go




浙公网安备 33010602011771号
【推荐】三生石上:ASP.NET Core中运行WebForms业务代码
【推荐】「指间灵动,快码加编」:通义灵码,再次降临博客园
【推荐】凡泰极客:跨越技术“鸿”沟,小程序一键生成鸿蒙App
【推荐】阿里云创新加速季,5亿补贴享不停,上云礼包抢先领
· 老生常谈!程序员为什么要阅读源代码?
· 如何安全地访问互联网
· 还在拼冗长的 WhereIf 吗?100行代码解放这个操作
· C#异步编程是怎么回事(番外)
· [WPF]Dispatcher 与消息循环
· 「指间灵动,快码加编」:阿里云通义灵码,再次降临博客园
· 面试官:你讲下接口防重放如何处理?
· 如何安全地访问互联网
· 手机上玩 PC 游戏的开源项目「GitHub 热点速览」
· 【译】Visual Studio 17.10 发布了新版扩展管理器