腐汝
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) }
【推薦】三生石上:ASP.NET Core中執行WebForms業務程式碼
【推薦】「指間靈動,快碼加編」:通義靈碼,再次降臨部落格園
【推薦】凡泰極客:跨越技術“鴻”溝,小程式一鍵生成鴻蒙App
【推薦】阿里雲創新加速季,5億補貼享不停,上雲禮包搶先領
· 老生常談!程式設計師為什麼要閱讀原始碼?
· 如何安全地訪問網際網路
· 還在拼冗長的 WhereIf 嗎?100行程式碼解放這個操作
· C#非同步程式設計是怎麼回事(番外)
· [WPF]Dispatcher 與訊息迴圈
· 「指間靈動,快碼加編」:阿里雲通義靈碼,再次降臨部落格園
· 面試官:你講下介面防重放如何處理?
· 如何安全地訪問網際網路
· 手機上玩 PC 遊戲的開源專案「GitHub 熱點速覽」
· 【譯】Visual Studio 17.10 釋出了新版擴充套件管理器