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

 

posted @ 2023-08-02 18:06  JvvYou  阅读(480)  评论(0编辑  收藏  举报