• Go 结构体和map等数据结构转json字符串


    文章转载自https://www.cnblogs.com/blog411032/p/10680355.html

    Go语言中使用json包中的 Marshal() 函数将数据结构转成json字符串,源代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func Marshal(v interface{}) ([]byte, error) {
        e := newEncodeState()
     
        err := e.marshal(v, encOpts{escapeHTML: true})
        if err != nil {
            return nil, err
        }
        buf := append([]byte(nil), e.Bytes()...)
     
        e.Reset()
        encodeStatePool.Put(e)
     
        return buf, nil
    }

      该函数接收一个参数 接口形式的参数(如果参数定义成接口类型)则可以接收任何参数。有两个返回值:字符切片、错误。

    结构体转json:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package main
     
    import (
        "encoding/json"
        "fmt"
    )
     
    //创建结构体
    type Student struct {
        Id int
        Name string
        Address []string
        IsWork bool
    }
     
    //封装返回结构体实例的方法
    func (s *Student) setStudentInfo(id int,name string,address []string, iswork bool) {
     
        s.Address = address
        s.Id = id
        s.IsWork = iswork
        s.Name = name
    }
     
    //封装返回结构体实例的方法  返回结构体的指针
    func getStudentInfo(id int,name string,address []string, iswork bool) *Student {
        return &Student{id,name,address,iswork}
    }
     
     
    func main() {
        var s Student
        //初始化结构体
        s.setStudentInfo(12,"jack",[]string{"sh","bj"},false)
        //将结构体转成json
        result , err := json.Marshal(s)
        if err != nil {
            fmt.Println("error")
        }
     
        fmt.Printf("result = %+v ",string(result))
     
        stu := getStudentInfo(13,"tom",[]string{"北京","上海","深圳"},true)
        fmt.Printf("type is %T ",stu)
     
        fmt.Printf("student = %+v ",stu)
        //获取结构体的name属性 本来是指针,但是可以直接获取其属性,这是go语言的语法糖
        fmt.Println("stu.Name = ",stu.Name)
        fmt.Println("(*stu).Name = ",(*stu).Name)
     
        result2,err2 := json.Marshal(stu)
        if err2 != nil {
            fmt.Println("error")
        }
     
        fmt.Println(string(result2))
     
    }

      

    map转json:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package main
     
    import (
        "encoding/json"
        "fmt"
    )
     
    func main() {
     
        m := make(map[string]interface{})
     
        m["name"] = "jack"
        m["address"] = []string{"北京","河南"}
        m["iswork"] = false
        m["age"] = 18
     
        result,err := json.Marshal(m)
        if err !=nil {
            fmt.Println("error")
        }
     
        fmt.Println(string(result))
    }

      

    json转结构体:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package main
     
    import (
        "encoding/json"
        "fmt"
    )
     
    /**
    json转结构体
     */
    func main() {
        //json串  内包含 一个切片  一个 int类型的age  一个bool类型的iswork 和一个 字符串类型的name
        jsonStr := `{"Address":["北京","河南"],"Age":18,"Iswork":false,"Name":"jack"}`
     
        var p Person
     
        json.Unmarshal([]byte(jsonStr),&p)
     
        fmt.Printf(" p = %+v ",p)
     
    }
     
    //定义结构体
    //结构体的名字首字母一定要大写,不然解析不出来
    type Person struct {
        Name string
        Age int
        Iswork bool
        Address []string
    }

      

    json转map:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    package main
     
    import (
        "encoding/json"
        "fmt"
    )
     
    func main() {
        //json串  内包含 一个切片  一个 int类型的age  一个bool类型的iswork 和一个 字符串类型的name
        jsonStr := `{"Address":["北京","河南"],"Age":18,"Iswork":false,"Name":"jack"}`
     
        m := make(map[string]interface{})
     
        json.Unmarshal([]byte(jsonStr),&m)
     
        //fmt.Println(m)
        //fmt.Printf("m = %+v ",m)
     
        for key,value := range m{
            //fmt.Printf("m[%s] = %+v ",key,value)
     
            //if key == "Address" {
            //  fmt.Printf("%T ",value)//得出类型为接口类型 []interface {}   原本为 切片类型
            //}
     
            //通过断言 推出数据的类型
            switch data := value.(type) {
            case string:
                fmt.Printf("m[%s] = %s ",key,data)
            case float64:
                fmt.Printf("m[%s] = %f ",key,data)
            case bool:
                fmt.Printf("m[%s] = %v ",key,data)
            case []string:
                fmt.Println("是字符串切片类型")
            case []interface{}:
                fmt.Printf("是接口切片类型: %s =====> %v ",key,data)
                fmt.Println("======开始遍历切片======")
                for index,v := range data{
                    fmt.Printf("%s[%d] = %s ",key,index,v)
                }
                fmt.Println("======遍历切片结束======")
            }
     
        }
     
    }

      

    如果不通过断言去判断类型,如果需要遍历json串内切片的数据就没办法操作了。

  • 相关阅读:
    Mysql group_concat
    canvas toDataUrl 跨域问题
    Svg操作
    java 判断浏览器
    排序操作
    java 格式判断
    你真的了解 console 吗
    svg转换工具
    java图片缩放
    常见 银行贷款 名词
  • 原文地址:https://www.cnblogs.com/1204guo/p/12930337.html
Copyright © 2020-2023  润新知