go数据和json格式数据之间的转换
go有一个官方包来操作json格式的数据,包位于encoding/json。
JSON编码
func Marshal(v interface{}) ([]byte, error)
返回用JSON编码v之后的值。
类型转换规则:
boolean值会编码成JSON的boolean;
float,integer会编码成JSON的number;
string值会编码成UTF-8JSON字符串,无效的字节用Unicode替换,"<"和">"编码成"\u003c" and "\u003e","&"编码成"\u0026";
array和slice会编码成JSON array,[]byte编码成base64字符串,空的slice编码成null;
struct会编码成JSON object。
空值是指false,0,空指针或者空interface,任何长度为0的array,slice,map或者string。
json对象默认的key字符串是strut的字段名,也可以自己指定名字,方法是在每个字段最后用“json”标签指定名字:
比如:
把上面的struct编码成json字符串时,Name字段的key是new,而不是Name。
"json"标签的用法:
1、`json:"-"`:编码的时候会忽略这个字段。
2、`json:"newName"`:指定字段在JSON字符串的key名字。
3、`json:"newName,omitempty"`:如果这个字段是空值,则不编码到JSON里面,否则用newName为名字编码。
4、`json:",omitempty"`:同上,不为空的话,这个字段的key还是用默认的struct字段名。
5、`json:",string"`:编码成字符串,这个string选项只适用字符串,浮点型和整型数据。
struct字段需要可导出才能编码成json,否则会忽略。
json解码
func Unmarshal(data []byte, v interface{}) error
从data解码JSON,结果存放在v,所以v参数需要引用传递参数。
转换规则和Marshal的规则相反。
还有其他一些规则:
如果是解析到一个指针,Unmarshal首先会检查是否是json字符null,如果是的话指针会设置为nil,其他情况Unmarshal会把值填充到指针所指的位置,如果是一个空指针则会分配一个新的位置。
如果是解析到struct,Unmarshal会用struct的字段名或者`json`标签指定的名字和json的key相匹配。
如果是解析到interface值,转化规则如下:
bool对应JSON的boolean,
float64对应JSON的number,
string对应JSON的string,
[]interface{}对应JSON的array
map[string]interface{}对应JSON的object
nil对应JSON的null。
如果一个JSON值没有适用的给定类型,或者JSON的数值超过了目标类型的范围,Unmarshal会跳过这个字段或者尽可能的解码。
本文转自:Sharks 非本站原创 如果侵犯了您的权力 请Email:13612963@qq.com 告知
相关文章