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编码的字符串

最新文章

  1. 在WPF中使用WinForm控件方法
  2. Django 后台管理设置(admin.py)
  3. LRU implement Data Structure analysis
  4. jira与mysql的配合搭建调整
  5. NoSQL你知多少?
  6. 浅析dex文件加载机制
  7. Linux下的Job Control(转:http://blog.chinaunix.net/uid-26495963-id-3062757.html)
  8. (转) [教程] Unity3D中角色的动画脚本的编写(一)
  9. Lucene核心--构建Lucene搜索(下篇,理论篇)
  10. java内存分析总结
  11. kloxo面板教程-折腾了一天
  12. Hibernate查询之API查询
  13. 老李推荐:第14章3节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer实例化
  14. 树莓派.GPRS.短信接收器
  15. 洛谷 [p1439] 最长公共子序列 (NlogN)
  16. Centos下Sphinx的下载与编译安装
  17. PHP 秒数 转时分秒 函数
  18. 一个关于C8051F350模拟电源的小问题
  19. Golang中使用lua进行扩展
  20. rocketmq控制台搭建(rocketmq-console)

热门文章

  1. MP4数据封装格式
  2. jQuery的显示和隐藏
  3. LNMP环境搭建BBS论坛及伪静态
  4. Django之简介
  5. Flutter——TabBar组件(顶部Tab切换组件)
  6. 算法笔试过程中的几个输入输出python语句
  7. mysql安装和遇到的问题处理
  8. java程序报错:Unable to open debugger port (127.0.0.1:63959): java.net.SocketException &quot;socket closed&quot;,编译过来就是无法打开调试器端口,套接字已关闭
  9. HTML5 服务器发送事件(Server-Sent Events)
  10. Mac卸载Python