zoukankan      html  css  js  c++  java
  • golang学习笔记--struct、json、map互相转化

    结构体生成Json

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    type IT struct {
    	Company string `json:"-"` //此字段不会输出到屏幕
    	//Company  string   `json:"company"`  // 这样打印输出别名首字母就会小写(二次编码)
    	Subjects []string `json:"subjects"` //二次编码
    	IsOk     bool     `json:",string"`
    	Price    float64  `json:",string"`
    }
    
    func main() {
    	//定义一个结构体变量,同时初始化
    	s := IT{"itcast", []string{"Golang", "PHP", "Java", "C++"}, true, 666.666}
    
    	//编码,根据内容生成json文本
    	//buf, err := json.Marshal(s)
    	//buf =  {"subjects":["Golang","PHP","Java","C++"],"IsOk":"true","Price":"666.666"}
    	buf, err := json.MarshalIndent(s, "", "    ") //格式化编码
    	if err != nil {
    		fmt.Println("err = ", err)
    		return
    	}
    
    	fmt.Println("buf = ", string(buf))
    }
    

      输出:

    buf =  {
        "subjects": [
            "Golang",
            "PHP",
            "Java",
            "C++"
        ],
        "IsOk": "true",
        "Price": "666.666"
    }
    

      

    Json转成结构体

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    type IT struct {
    	Address   string   `json:"address"`
    	Languages []string `json:"languages"` //二次编码
    	Status    bool     `json:"isok"`
    	Price     float64  `json:"price"`
    }
    
    func main() {
    
    	jsonBuf := `
        {
        "address": "北京",
        "languages": [
            "Golang",
            "PHP",
            "Java",
            "Python"
        ],
        "status": true,
        "price": 666.666
    }`
    
    	var tmp IT                                   //定义一个结构体变量
    	err := json.Unmarshal([]byte(jsonBuf), &tmp) //第二个参数要地址传递
    	if err != nil {
    		fmt.Println("err = ", err)
    		return
    	}
    	//fmt.Println("tmp = ", tmp)
    	fmt.Printf("tmp = %+v
    ", tmp)
    
    	type IT2 struct {
    		Subjects []string `json:"languages"` //二次编码
    	}
    
    	var tmp2 IT2
    	err = json.Unmarshal([]byte(jsonBuf), &tmp2) //第二个参数要地址传递
    	if err != nil {
    		fmt.Println("err = ", err)
    		return
    	}
    	fmt.Printf("tmp2 = %+v
    ", tmp2)
    
    }
    

      输出:

    tmp = {Address:北京 Languages:[Golang PHP Java Python] Status:false Price:666.666}
    tmp2 = {Subjects:[Golang PHP Java Python]}
    

      

    Map生成Json

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    func main() {
    	//创建一个map
    	m := make(map[string]interface{}, 4) //因为类型多,可以用interface空接口
    	m["address"] = "北京"
    	m["languages"] = []string{"Golang", "PHP", "Java", "Python"}
    	m["status"] = true
    	m["price"] = 666.666
    
    	//编码成json
    	//result, err := json.Marshal(m)
    	//result =  {"address":"北京","languages":["Golang","PHP","Java","Python"],"price":666.666,"status":true}
    	result, err := json.MarshalIndent(m, "", "    ")
    	if err != nil {
    		fmt.Println("err = ", err)
    		return
    	}
    	fmt.Println("result = ", string(result))
    }
    

      输出:

    result =  {
        "address": "北京",
        "languages": [
            "Golang",
            "PHP",
            "Java",
            "Python"
        ],
        "price": 666.666,
        "status": true
    }
    

      

    Json转化为Map

    package main
     
    import (
        "encoding/json"
        "fmt"
    )
     
    func main() {
        jsonBuf := `
        {
        "company": "itcast",
        "subjects": [
            "Go",
            "C++",
            "Python",
            "Test"
        ],
        "isok": true,
        "price": 666.666
    }`
     
        //创建一个map
        m := make(map[string]interface{}, 4)
     
        err := json.Unmarshal([]byte(jsonBuf), &m) //第二个参数要地址传递
        if err != nil {
            fmt.Println("err = ", err)
            return
        }
        fmt.Printf("m = %+v
    ", m)
     
        //    var str string
        //    str = string(m["company"]) //err, 无法转换
        //    fmt.Println("str = ", str)
     
        var str string
     
        //类型断言, 值,它是value类型
        for key, value := range m {
            //fmt.Printf("%v ============> %v
    ", key, value)
            switch data := value.(type) {
            case string:
                str = data
                fmt.Printf("map[%s]的值类型为string, value = %s
    ", key, str)
            case bool:
                fmt.Printf("map[%s]的值类型为bool, value = %v
    ", key, data)
            case float64:
                fmt.Printf("map[%s]的值类型为float64, value = %f
    ", key, data)
            case []string:
                fmt.Printf("map[%s]的值类型为[]string, value = %v
    ", key, data)
            case []interface{}:
                fmt.Printf("map[%s]的值类型为[]interface, value = %v
    ", key, data)
            }
     
        }
     
    }
    

      输出:

    m = map[company:itcast isok:true price:666.666 subjects:[Go C++ Python Test]]
    map[company]的值类型为string, value = itcast
    map[subjects]的值类型为[]interface, value = [Go C++ Python Test]
    map[isok]的值类型为bool, value = true
    map[price]的值类型为float64, value = 666.666000
    

      

     []interface{}转json

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    func main() {
    	var s []interface{}
    	s = append(s, 5)
    	s = append(s, []string{"Golang", "PHP", "Java", "Python"})
    	s = append(s, map[string]string{"hello": "world"})
    	result, err := json.MarshalIndent(s, "", "    ")
    	if err != nil {
    		fmt.Println("err = ", err)
    		return
    	}
    	fmt.Println("result = ", string(result))
    }
    

      输出:

    result =  [
        5,
        [
            "Golang",
            "PHP",
            "Java",
            "Python"
        ],
        {
            "hello": "world"
        }
    ]
    

      

  • 相关阅读:
    linux(centos6.9) 安装mongoDB
    vue $refs
    vue $emit的使用方式
    docker上部署一个项目常用命令
    Nginx之Location匹配规则
    Github Packages和Github Actions实践之CI/CD
    消息中间件选型分析:从 Kafka 与 RabbitMQ 的对比看全局
    发布Jar包到maven中央仓库
    一些小Tip
    有风格的程序员,写有风格的代码
  • 原文地址:https://www.cnblogs.com/saryli/p/13043692.html
Copyright © 2011-2022 走看看