golang字符串转结构体
golang字符串转结构体
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、通用方式
一个通用的结构体,不管来源的类型,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)
}
本文阅读量 次