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