• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

GO- 使用JSON

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1 json.Marshal  把对象转换为JSON的方法

原型如下

func Marshal(v interface{}) ([]byte, error)
这个函数接收任意类型的数据 v,并转换为字节数组类型,返回值就是我们想要的JSON数据和一个错误代码。当转换成功的时候,这个错误代码为nil。在进行对象转换为 JSON 的过程中,会遵循如下几条规则

  1. 布尔型转换为 JSON 后仍是布尔型 , 如true -> true
  2. 浮点型和整数型转换后为JSON里面的常规数字,如 1.23 -> 1.23
  3. 字符串将以UTF-8编码转化输出为Unicode字符集的字符串,特殊字符比如<将会被转义为\u003c
  4. 数组和切片被转换为JSON 里面的数组,[]byte类会被转换为base64编码后的字符串,slice的零值被转换为null
  5. 结构体会转化为JSON对象,并且只有结构体里边以大写字母开头的可被导出的字段才会被转化输出,而这些可导出的字段会作为JSON对象的字符串索引
  6. 转化一个map 类型的数据结构时,该数据的类型必须是 map[string]T(T 可以是encoding/json 包支持的任意数据类型)

例子:

    type Movie struct {
        Title  string
        Year   int  `json:"released"`
        Color  bool `json:"color,omitempty"`
        Actors []string
        notex  int
    }

    movies := []Movie{
        {Title: "Casablanca", Year: 1942, Color: false,
            Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}, notex: 100},
        {Title: "Cool Hand Luke", Year: 1967, Color: true,
            Actors: []string{"Paul Newman"}, notex: 200},
        {Title: "Bullitt", Year: 1968, Color: true,
            Actors: []string{"Steve McQueen", "Jacqueline Bisset"}, notex: 300},
        // ...
    }

    data, err := json.Marshal(movies)
    if err != nil {
        //log.Fatalf("JSON marshaling failed: %s", err)
    }    fmt.Printf("%s\n", data)
注: 
只有导出的结构体成员才会被编码,也就是说只有大写字母开头的成员名称的结构体成员才会被编码。
为了生成便于阅读的格式,另一个json.MarshalIndent函数将产生整齐缩进的输出。该函数有两个额外的字符串参数用于表示每一行输出的前缀和每一个层级的缩进

,比如data, err := json.MarshalIndent(movies, "", " ")

2 结构体标签

如果希望手动配置结构体的成员和JSON字段的对应关系,可以在定义结构体的时候给成员打标签。使用omitempty,如果该字段为nil或0值(数字0,字符串"",空数组[]等),则打包的JSON结果不会有这个字段。比如

  1. type Message struct {  
  2.     Name string `json:"msg_name"`       // 对应JSON的msg_name  
  3.     Body string `json:"body,omitempty"` // 如果为空置则忽略字段  
  4.     Time int64  `json:"-"`              // 直接忽略字段  
  5. }  

 

3 json.RawMessage

json.RawMessage其实就是[]byte类型的重定义。可以进行强制类型转换。

现在有这么一种场景,结构体中的其中一个字段的格式是未知的:

  1. type Command struct {  
  2.     ID   int  
  3.     Cmd  string  
  4.     Args *json.RawMessage  
  5. }  

 

使用json.RawMessage的话,Args字段在Unmarshal时不会被解析,直接将字节数据赋值给Args。我们可以能先解包第一层的JSON数据,然后根据Cmd的值,再确定Args的具体类型进行第二次Unmarshal。

这里要注意的是,一定要使用指针类型*json.RawMessage,否则在Args会被认为是[]byte类型,在打包时会被打包成base64编码的字符串

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go语言命令行工具介绍-3发布时间:2022-07-10
下一篇:
Go语言 - 并发编程发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap