golang json字串轉結構體

腐汝發表於2023-08-02

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
好文要頂 關注我 收藏該文 微信分享
腐汝
粉絲 - 4 關注 - 2
0
0
« 上一篇: System is booting up. See pam_nologin(8)
» 下一篇: prometheus的sdk client_golang 使用 定時器
posted @ 2023-08-02 18:06 腐汝 閱讀(351) 評論(0) 編輯 收藏 舉報
會員力量,點亮園子希望
重新整理頁面返回頂部
【推薦】這場阿里雲開發者社群有獎徵文活動,期待您出文相助
【推薦】三生石上:ASP.NET Core中執行WebForms業務程式碼
【推薦】「指間靈動,快碼加編」:通義靈碼,再次降臨部落格園
【推薦】凡泰極客:跨越技術“鴻”溝,小程式一鍵生成鴻蒙App
【推薦】阿里雲創新加速季,5億補貼享不停,上雲禮包搶先領
編輯推薦:
· 老生常談!程式設計師為什麼要閱讀原始碼?
· 如何安全地訪問網際網路
· 還在拼冗長的 WhereIf 嗎?100行程式碼解放這個操作
· C#非同步程式設計是怎麼回事(番外)
· [WPF]Dispatcher 與訊息迴圈
閱讀排行:
· 「指間靈動,快碼加編」:阿里雲通義靈碼,再次降臨部落格園
· 面試官:你講下介面防重放如何處理?
· 如何安全地訪問網際網路
· 手機上玩 PC 遊戲的開源專案「GitHub 熱點速覽」
· 【譯】Visual Studio 17.10 釋出了新版擴充套件管理器

相關文章