前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >encoding/json

encoding/json

作者头像
酷走天涯
发布2019-06-11 16:28:15
6050
发布2019-06-11 16:28:15
举报
文章被收录于专栏:每日一篇技术文章

json 包实现了json对象的编解码

  • 获取v变量的json编码
  • 将json编码的数据存入到解析v变量中
  • 如何实现延时解析
  • 实现标准HTML转义
  • 实现json字符串格式缩进和前缀
  • 剔除编码后数据中的空白字符
  • 结构体json编码选项应用
获取v变量的json编码

func Marshal(v interface{}) ([]byte, error)

代码语言:javascript
复制
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))
}

image.png


将json编码的数据存入到解析v变量中

func Unmarshal(data []byte, v interface{}) error

代码语言:javascript
复制
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)
}

image.png


如何实现延时解析
代码语言:javascript
复制
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)
}

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转义

代码语言:javascript
复制
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())
}

image.png


实现json字符串格式缩进和前缀

func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error

代码语言:javascript
复制
package main

import (
    "encoding/json"
         "fmt"
)
func main() {
  data := []map[string]string {{"name":"小黄"},{"name":"小白"}}
  result,_:=json.MarshalIndent(data,"=","\t")
  fmt.Println(string(result))
}

image.png


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

func Compact(dst *bytes.Buffer, src []byte) error

代码语言:javascript
复制
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())
}

image.png

结构体json编码选项应用
  • 忽略字段 (Field int json:"-")
  • 修改编码后的键值名(Field int json:"myName")
  • 字段空值忽略编码(Field int json:"myName,omitempty")
  • 设置默认值,如果值为空,则忽略(Field int json:",omitempty")
  • 格式转换 (Int64String int64 json:",string")
代码语言:javascript
复制
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))
  }

image.png

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.12.25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 获取v变量的json编码
  • 将json编码的数据存入到解析v变量中
  • 如何实现延时解析
  • 实现标准HTML转义
  • 实现json字符串格式缩进和前缀
  • 剔除编码后数据中的空白字符
  • 结构体json编码选项应用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档