大家一起学Golang——JSON编码

大家一起学Golang——JSON编码

  • Json编码 Struct–>Json, Map–>Json
  • Json解码 Json–>Struct,Json–>Map
Json操作

json是一种数据交换格式,完全独立于编程语言的键/值对集合的文本形式,可以存储字符串,数值,布尔值,数组等,常用于web开发中客户端与服务器之间的数据通信。
形式:{“id”:1,“name”:“jack”,“skills”:[“python”,“go”]}

JSON编码

go语言内置了对JSON的支持,encoding/jsonb标准库,来生成和解析JSON数据格式。
json.Marshal()对JSON格式进行编码(序列化的过程),func Marshal(v interface{}) ([]byte, error)

  • 结构体转成Json结构
package main

import (
	"encoding/json"
	"fmt"
)

type Job struct {
	Company string
	Subject []string
	IsOk bool
	Salary float64
}

func main() {
	jb := Job{"jack",[]string{"go","web","Linux},true,15000.00}
	//b是[]byte类型
	b, err := json.Marshal(jb)
	if err!= nil{
		fmt.Println("json err",err)
	}
	fmt.Println(string(b)) //将结果转换成字符串
}
  • 字典map编码Json
    上述是将结构体的对象转换成Json格式,下面是将Map类型转成Json,首先创建map 存储值类型是interface{} 空结构体用来存储不同格式的数据,再Marshal()转换Json格式。
	jb := make(map[string]interface{})
	jb["conmpany"] = "rose"
	jb["subject"] = []string{"go", "python"}
	jb["isok"] = true
	jb["salary"] = 90.1
	b, err := json.Marshal(jb)
	if err != nil {
		fmt.Prinln("json err:", err)
	}
    fmt.Println(string(b))
JSON解码

json.Unmarshal()将JSON格式解码为go的数据结构,func Unmarshal(data []byte, v interface{}) error参数分别是json格式的文本,目标输出容器。

  • 解析json到结构体
type Job struct{
	Company string `json:"company"`
	Subject []string `json:"subject"`
	IsOk bool `json:"isok"`
	Salary float64 `json:"salary"`
}
func main(){
//注意到byte中 使用的反引号
	b:= []byte(`{"Company":"TMD","Subject":["go","web"],"IsOk":true,"Salary":15000.00}`)
	var jb Job
	err := json.Unmarshal(b, &jb)
	if err != nil {
		fmt.Println("json err:",err)
	}
	fmt.Println(jb)  //输出:{TMD [go web] true 15000}
}
  • 解析json到map
func main() {
	b := []byte(`{"Company":"TMD","Subject":["go","web"],"IsOk":true,"Salary":1500.12}`)
	var jb interface{}
	err := json.Unmarshal(b, &jb)
	if err != nil {
		fmt.Println("json err:", err)
	}
	//断言是针对接口类型 如element.(T) element必须是接口类型,T是普通类型,这里将jb转成map[string]interface{}返回值给m
	m := jb.(map[string]interface{})
	for k, v := range m {
		//断言判断v的类型
		switch val := v.(type) {
		case string:
			fmt.Println(k, "is string", val)
		case int:
			fmt.Println(k, "is int", val)
		case float64:
			fmt.Println(k, "is float64", val)
		case bool:
			fmt.Println(k, "is bool", val)
		case []interface{}:
			fmt.Println(k, "is an array:")
			for i, u := range val {
				fmt.Println(i, u)
			}
		default:
			fmt.Println(k, "is of a type I don't know how to handle")
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值