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))
}

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)
}

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)
}

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())
}

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))
}

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())
}

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))
  }

image.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 指针

    例如变量 a 的值是123 ,123存储的内存地址为0x123456,则我们定义一个指针类型的变量b,让它的值为0x123456,那么我们去这块物理内存的值时,...

    酷走天涯
  • console有趣的用法

    1.修改控制台输出内容样式 2.重写控制台输出格式(追加出错日期) 3.以表格的形式显示控制台输出内容 4.如何统计一个函数在程序中被调用的总次数 5....

    酷走天涯
  • 路径path的常用操作

    路径包只能用于以正斜杠分隔的路径,例如 URL 中的路径。此软件包不处理带有驱动器号或反斜杠的 Windows 路径; 要操作操作系统路径,请使用路径/文件路径...

    酷走天涯
  • Golang的json操作

    package main import ( "encoding/json" "fmt" "os") type ConfigStru...

    李海彬
  • Golang语言-操作json,注意json的嵌套、数组

    package main import ( "encoding/json" "fmt" "os" ) type ConfigStruct struct { Ho...

    李海彬
  • Greenplum数据库使用总结(干货满满)--对JSON的支持

    JSON作为结构化的数据,目前越来越受到开发者的爱戴,它简单灵活易于理解。是作为储存数据的一种比较使用的一种格式,greenplum从5.0开始便很好的支持了J...

    小徐
  • Python json 模块dumps、dump、loads、load的使用

    本文主要讲下json.dumps和json.dump、json.loads和json.load的区别,因为经常需要加载json文件,读取数据,傻傻分不清...

    用户1332428
  • Python爬虫爬取百度翻译之数据提取方法

    工具:Python 3.6.5、PyCharm开发工具、Windows 10 操作系统

    用户2398817
  • Python json 模块dumps、dump、loads、load的使用

    本文主要讲下json.dumps和json.dump、json.loads和json.load的区别,因为经常需要加载json文件,读取数据,傻傻分不清...

    致Great
  • MySQL向MongoDB的妥协之JSON

    MySQL在5.7.8版本中增加了对json数据的支持,而不再是需要使用字符串形式进行存储。下面简单介绍下MySQL对json的操作:

    Jean

扫码关注云+社区

领取腾讯云代金券