Json包
2022-07-12 本文已影响0人
菩提树下参悟
encoding/json
encoding/json
是官方提供的标准json, 实现RFC 7159中定义的JSON编码和解码。使用的时候需要预定义struct
,原理是通过reflection
和interface
来完成工作, 性能低。
常用的接口:
-
func Marshal(v interface{}) ([]byte, error)
生成JSON
把对象转换为JSON:
• 布尔型转换为 JSON 后仍是布尔型 , 如true -> true
• 浮点型和整数型转换后为JSON里面的常规数字,如 1.23 -> 1.23
• 字符串将以UTF-8编码转化输出为Unicode字符集的字符串,特殊字符比如<将会被转义为\u003c
• 数组和切片被转换为JSON 里面的数组,[]byte类会被转换为base64编码后的字符串,slice的零值被转换为null
• 结构体会转化为JSON对象,并且只有结构体里边以大写字母开头的可被导出的字段才会被转化输出,而这些可导出的字段会作为JSON对象的字符串索引
• 转化一个map 类型的数据结构时,该数据的类型必须是 map[string]T(T 可以是encoding/json 包支持的任意数据类型) -
func Unmarshal(data []byte, v interface{}) error
解析JSON到struct
把 JSON 转换回对象的方法:
这个函数会把传入的 data 作为一个JSON来进行解析,解析后的数据存储在参数 v 中。这个参数 v 也是任意类型的参数(但一定是一个类型的指针),原因是我们在是以此函数进行JSON 解析的时候,这个函数不知道这个传入参数的具体类型,所以它需要接收所有的类型。
package main
import (
"encoding/json"
"fmt"
)
//结构体与json
//1.序列化:把Go语言中的结构体变量--》json格式的字符串
//2.反序列化:jso格式的字符串 --》Go语言中识别的结构体变量
type person struct {
Name string `json:"name" db:"name" ini:"name"`//结构体字段的可见性,json包,db数据库,ini文件
Age int `json:"age"`
}
func main() {
p1 := person{
Name: "小林",
Age: 90,
}
//序列化
b, err := json.Marshal(p1)
if err != nil {
fmt.Printf("marshal failed,err:%v", err)
}
fmt.Println(string(b))
fmt.Printf("%#v\n", string(b))
//反序列化
str := `{"name":"理想","age":18}`
var p2 person
json.Unmarshal([]byte(str), &p2) // 传指针是为了能在json.Unmarshal内部修改p2 的值
fmt.Printf("%#v\n", p2)
}
json格式的在线工具
json