encoding/json

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))
}
1594482-e4ea392c8970d9b3.png
image.png

将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)
}
1594482-61cda0fb91ce556e.png
image.png

如何实现延时解析
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)
}
1594482-7e80f479b5df7588.png
image.png

实现标准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())
}
1594482-c7f911e7f05ab5ab.png
image.png

实现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))
}
1594482-8f261a79136ec7ca.png
image.png

剔除编码后数据中的空白字符

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())
}
1594482-2b78aa84b78c0b4d.png
image.png
结构体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))
  }
1594482-6bd104296b9f06d5.png
image.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值