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”标签指定名字:
比如:
type Personal struct { Name string `json:"new"` Age int Height int }
把上面的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,否则会忽略。
package main import ( "fmt" "encoding/json" ) type Personal struct { Name string Age int `json:",omitempty"` T []string N float64 `json:",string"` S []byte } func main() { var p = Personal{ Name: "Jack", //Age : 25, T : []string{"a", "b", "c"}, N : 55.5, S : []byte("abc我哈哈哈你没sd"), } j, _ := json.Marshal(p) fmt.Println(string(j)) }
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会跳过这个字段或者尽可能的解码。
var jsonBlob = []byte(`[ {"Name": "Platypus", "Order": "Monotremata"}, {"Name": "Quoll", "Order": "Dasyuromorphia"} ]`) type Animal struct { Name string Order string } var animals []Animal err := json.Unmarshal(jsonBlob, &animals) if err != nil { fmt.Println("error:", err) } fmt.Printf("%+v\n", animals) for _, v := range animals { fmt.Println(v) fmt.Println(v.Name) fmt.Println(v.Order) }
了解更多可以参考官方博客的文章:http://blog.golang.org/json-and-go
本文链接:https://360us.net/article/33.html