golang json字符串转结构体

腐汝 / 2023-08-02 / 原文

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串之前的数据结构,不熟悉的代价就是花时间折腾。