json 序列化
go
语言中序列化 json
数据使用 json.marshal
方法,代码如下:
func main() { mm := map[string]interface{}{ "name": "uccs", "age": 12, "extra": map[string]interface{}{ "phone": "12345678910", }, } bytes, _ := json.marshal(mm) fmt.println(string(bytes)) }
如果说需要对 json
数据进行格式化输出,可以使用 json.marshalindent
方法,代码如下:
marshalindent
第一个参数是要序列化的数据,第二个参数是前缀,第三个参数是缩进字符
json.marshalindent(mm, "", " ")
序列化结构体
序列化结构体的时候,需要注意以下 2
点:
- 结构体的字段必须是大写字母开头,否则无法序列化
- 可以使用
json tag
来指定序列化后的字段名
json tag
使用方式:
json:"name"
表示序列化后的字段名为name
json:"phone,omitempty"
表示序列化后的字段名为phone
,如果字段值为空,则不序列化- 如果是指针形式的字段
- 字段值为空,则不序列化,例如下面的
name
字段,不会被序列化,因为指针为nil
- 字段值是空字符串,则序列化,例如下面的
email
字段,会被序列化,因为指针不为nil
- 字段值为空,则不序列化,例如下面的
type person struct { name *string `json:"name,omitempty"` email *string `json:"email,omitempty"` } email := "" p := person{ email: &email, }
json:"age,string"
序列化时可以将数字变成字符串json:"-"
序列化时忽略该字段
反序列化
go
反序列化使用 json.unmarshal
方法,传入 json
字符串和结构体指针,代码如下:
func main() { j := `{ "name": "uccs", "age": 18, "email": "", "phone": "2222" }` var p person _ := json.unmarshal([]byte(j), &p) fmt.println(p) }
反序列化的时候,需要注意,传递空字符串和没有传递字段是没有区别的,都会被反序列化,例如上面的 email
字段,传递空字符串和没有传递字段拿到的值都是一个空
如何区分传递空字符串和没有传递字段呢?
需要在定义结构体的时候使用指针类型,例如下面的 email
字段,如果传递空字符串,则 email
字段的值是一个地址,如果没有传递字段,则 email
字段的值是 nil
type person struct { name string `json:"name"` age int `json:"age"` email *string `json:"email"` phone string `json:"phone"` } j := `{ "name": "uccs", "age": 18, "phone": "2222" }` k := `{ "name": "uccs", "age": 18, "email": "", "phone": "2222" }` var p1 person var p2 person _ := json.unmarshal([]byte(j), &p1) _ := json.unmarshal([]byte(k), &p2) fmt.println(p1) // {uccs 18 <nil> 2222} fmt.println(p2) // {uccs 18 0xc000014140 2222}
所以我们可以通过判断 email
字段是否为 nil
来区分传递空字符串和没有传递字段
fmt.println(p1.email == nil) // email 是否为 nil 判断是否传递了 email 字段
encoder
encoder
是一个 writer
接口,可以用于写入文件
相比于 file.writestring(string(bytes))
方式,encoder
可以直接将结构体写入文件,并且是以流的方式写入
func main() { p := person{ name: "xiaoming", age: 543251, } file, _ := os.create("person.json") defer file.close() encoder := json.newencoder(file) encoder.setescapehtml(true) // 转义 json 中的特殊字符 encoder.encode(p) }
decoder
decoder
是一个 reader
接口,可以用于读取文件
decoder
是 encoder
的逆操作,可以从文件中读取 json
数据并且反序列化
func main() { file, _ := os.open("person.json") defer file.close() decoder := json.newdecoder(file) p := person{} decoder.decode(&p) fmt.println(p) }
到此这篇关于go语言中json处理方式详解的文章就介绍到这了,更多相关go json处理方式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论