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) }