大家一起学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")
}
}
}