Go JSON

Posted 子曰五溪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go JSON相关的知识,希望对你有一定的参考价值。

如今在网络编程中JSON这种数据格式占据了较大的市场,如果不出意外,几乎新开发的数据交互,都会使用JSON这种轻量级的数据格式来处理数据交互。所以,怎么解析,转换JSON,成了大多数语言的一种标准模块。今天,我想给大家分享的是Go语言里的标准库"encoding/json"。


转换对应表:


  • bool类型 转换成JSON中的boolean

  • 整型,浮点型转换成JSON中的Number

  • 字符串转换成JSON中的字符串(""而不是'')

  • 结构体转换成JSON中的Object

  • []byte 会先base64然后转换成JSON中的字符串(""而不是'')

  • map 转换成JSON中的Object

  • interface{} 会按内部的类型进行实际转换

  • nil 会转换成JSON中的Null


encodeing/json几乎常用的就两个方法:


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

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


顾名思义“Marshal”将Go对象进行转换成JSON,而"Unmarshal"则是将JSON转换成Go对象。


不过在转换的过程中,如果我们定义的是结构体,跟Map会有一些不同,以下几点是要注意的:


  • 结构体的成员必须是大写开头

  • 使用Marshal时会按结构体成员的变量名做为Key

  • Unmarshal时会自动匹配结构体成员,大小写不敏感,如果JSON中有多余字段,会直接抛弃,如果缺少某个字段,则会忽略对结构体成员赋值


根据这些规则来说,如果在使用时稍微不注意,可能会有意想不到的错误,举个例子,有一个请求,需要传入参数{"name":"", "age":""},我们定义一个struct结构如下:


type Request struct{   
   Name string    Age string
}


在进行Marshal会用结构体的成员变量名做为Key,于是我们会得到{"Name":"","Age":""} ,这和请求需要的参数是不同的,所以我们还需要使用到structTag,为了对应关系可以一一对应上,我们需要手动的为结构体打上Tag,才能转换到正确的JSON。


type Request struct{   
   Name string  `json:"name"`    Age string  `json:"age"`
}


这种情况,几乎是要给对方传递参数时才用到,多数情况下,如果是Unmarshal,因为大小写不敏感,所以不需要structTag,但是,如果JSON的key是比如"f_name",这种,那么,依然需要structTag


type Request struct{   
   Name string  `json:"f_name"`    Age string  `json:"age"`
}


structTag还有一些其他有用的属性,比如:


  • omitempty 如果JSON字段为空则忽略

  • - 直接忽略


有时候你想更灵活的使用JSON,这个时候就要用到json.RawMessage,多数情况下,我们不会使用到它。加上在JSON中,有一个字段的格式是未知的,比如可能是string,也可能是int,那么这个时候就要用到*json.RawMessage了。




你也可以关注我的新浪微博,搜索i_icepy,很期待和大家交流

以上是关于Go JSON的主要内容,如果未能解决你的问题,请参考以下文章

你知道的Go切片扩容机制可能是错的

json 个人的vscode的代码片段

golang的xorm如何将[]map[string][]byte 格式的数据序列化成json输出

实用代码片段将json数据绑定到html元素 (转)

json 可视代码工作室Angular with Firebase片段

vs code 用户代码片段 html.json