json 包实现了json对象的编解码
- 获取v变量的json编码
- 将json编码的数据存入到解析v变量中
- 如何实现延时解析
- 实现标准HTML转义
- 实现json字符串格式缩进和前缀
- 剔除编码后数据中的空白字符
- 结构体json编码选项应用
获取v变量的json编码
func Marshal(v interface{}) ([]byte, error)
package main
import (
"encoding/json"
"fmt"
"log"
)
type User struct {
Name string
Age int64
}
func main() {
user := User{"酷走天涯",27}
b,error:=json.Marshal(user)
if error != nil {
log.Fatal(error)
}
fmt.Println(string(b))
}

将json编码的数据存入到解析v变量中
func Unmarshal(data []byte, v interface{}) error
package main
import (
"encoding/json"
"fmt"
"log"
)
type User struct {
Name string
Age int64
}
func main() {
data := []byte(`{"Name":"酷走天涯","Age":27}`)
var user *User
error:=json.Unmarshal(data,&user)
if error != nil {
log.Fatal(error)
}
fmt.Println(user)
}

如何实现延时解析
package main
import (
"encoding/json"
"fmt"
"log"
)
type Animal struct {
Kind string
Data json.RawMessage
}
type Dog struct{
Name string
}
type Sheep struct{
Name string
Age int
}
func main() {
data := []byte(`[{"Kind":"Dog","Data":{"Name":"小黄"}},{"Kind":"Sheep","Data":{"Name":"小绵阳","Age":12}}]`)
// 第一层转换数据
var animals *[]Animal
error:=json.Unmarshal(data,&animals)
if error != nil {
log.Fatal(error)
}
// 第二层 跟你kind 类型选择对应的模型进行转换
for _,c := range *animals{
var dst interface{}
switch c.Kind {
case "Dog": dst = new(Dog)
case "Sheep": dst = new(Sheep)
}
error := json.Unmarshal(c.Data,dst)
if error != nil {
fmt.Println(error)
}
fmt.Println(dst)
}
fmt.Println(animals)
}

实现标准HTML转义
func HTMLEscape(dst *bytes.Buffer, src []byte)
HTMLEscape 函数将json编码的src中的<、>、&、U+2028 和U+2029字符替换为\u003c、\u003e、\u0026、\u2028、\u2029 转义字符串,以便json编码可以安全的嵌入HTML的<script>标签里,
网络浏览器不支持在<script>标签中使用标准HTML转义
package main
import (
"encoding/json"
"bytes"
"fmt"
)
func main() {
data := []byte(`<div>这个是html标签</div>`)
var buffer bytes.Buffer
json.HTMLEscape(&buffer,data)
fmt.Println(buffer.String())
}

实现json字符串格式缩进和前缀
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := []map[string]string {{"name":"小黄"},{"name":"小白"}}
result,_:=json.MarshalIndent(data,"=","\t")
fmt.Println(string(result))
}

剔除编码后数据中的空白字符
func Compact(dst *bytes.Buffer, src []byte) error
package main
import (
"encoding/json"
"fmt"
"bytes"
)
func main() {
data := []map[string]string { {"name": "小黄"},{"name": "小白"}}
src,_ := json.MarshalIndent(data,"","\t")
var buf bytes.Buffer
json.Compact(&buf,src)
fmt.Println(string(src))
fmt.Println(buf.String())
}

结构体json编码选项应用
- 忽略字段 (Field int
json:"-"
) - 修改编码后的键值名(Field int
json:"myName"
) - 字段空值忽略编码(Field int
json:"myName,omitempty"
) - 设置默认值,如果值为空,则忽略(Field int
json:",omitempty"
) - 格式转换 (Int64String int64
json:",string"
)
package main
import (
"encoding/json"
"fmt"
)
type User struct{
Id int `json:"-"`
Name string `json:"myName"`
Age int `json:"myAge,omitempty"`
Address string `json:",omitempty"`
Sex int `json:",string"`
}
func main() {
user := User{Id:10,Name:"酷走天涯",Age:12,Address:"dd",Sex:1}
data,error := json.Marshal(user)
if error != nil {
fmt.Println(error)
}
fmt.Println(string(data))
user = User{Id:10,Name:"酷走天涯",Sex:1,Address:""}
data,error = json.Marshal(user)
if error != nil {
fmt.Println(error)
}
fmt.Println(string(data))
}

网友评论