golang json字符串转结构体

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
分类: go
 
« 上一篇: Go语言什么时候该使用指针 与 指针使用分析
» 下一篇: golang json转struct
posted @ 
 
 
 
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2023-06-12 ELK分析Nginx日志和可视化展示
2023-06-12 SRE传道,如何解决系统报错:nf_conntrack: table full, dropping packets
2023-06-12 MySQL闪回工具简介 及 binlog2sql工具用法
2023-06-12 MySQL8.0轻松搞定GTID主从复制
2023-06-12 MySql5.7主从同步配置(gtid模式)
2023-06-12 Golang 应用脚手架
2021-06-12 【MySQL】通过Percona Monitoring and Management实现数据库的监控
 
 
posted @   技术颜良  阅读(45)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示