Golang 如何解析和生成json
JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及浏览器的?冉ǹ焖俳馕鲋С郑?沟闷涓?视糜谕?缡?荽?淞煊颉?/p>
Golang自带的JSON解析库encoding/json,可以用起将结构化数据序列化成json字符串或从json字符串中解析出我们想要的数据。
1.解析json
给一个较为复杂的json字符串,包含数组,数组的元素是json对象。我们需要取出数组第一个元素中的某一个字段值。其它的解析均可参考下面的代码。
package mainimport ( 'encoding/json' 'fmt')func main() { jsonStr := []byte(`{'uin':1589276509,'feedID':10000,'videos':[{'picture':'http://qqpublic.qpic.cn/avatar.jpg','duration':'839'}]}`) var jsonMap map[string]interface{} if err := json.Unmarshal(jsonStr, &jsonMap); err!=nil { fmt.Printf('json decode failed, err=%v', err) return } value, ok:=jsonMap['videos'] fmt.Printf('value=%#vn', value) if ok {sliceValue, ok := value.([]interface{})if ok { mapValue, ok := sliceValue[0].(map[string]interface{}) if ok {duration, ok := mapValue['duration']if ok { fmt.Printf('d=%v,type=%Tn',duration,duration)} }} }}
程序输出:
value=[]interface {}{map[string]interface {}{'picture':'http://qqpublic.qpic.cn/avatar.jpg', 'duration':'839'}}d=839,type=string
解析json字符串时,需要注意如下几点:(1)Go类型和JSON类型的对应关系如下:
map[string]interface{}代表JSON对象[]interface{}代表JSON数组bool代表JSON booleansfloat64代表JSON numbersstring代表JSON stringsnil 代表JSON null
2.生成json
假设我们有如下一个类(结构体)student 及其一个实例对象st,将其序列化为json,具体实现如下:
package mainimport ( 'encoding/json' 'fmt')type Stu struct { Name string `json:'name'` Age int sex string Class *Class `json:'class'`}type Class struct { Name string Grade int}func main() {//实例化一个数据结构,用于生成json字符串 stu := Stu{ Name: '张三', Age: 18, sex: '男', } //指针变量 cla := new(Class) cla.Name = '1班' cla.Grade = 3 stu.Class=cla //Marshal失败时err!=nil jsonStu, err := json.Marshal(stu) if err != nil { fmt.Println('生成json字符串错误') } //jsonStu是[]byte类型,转化成string类型便于查看 fmt.Println(string(jsonStu))}
程序输出结果:
{'name':'张三','Age':18,'class':{'Name':'1班','Grade':3}}
阅读以上代码可以看出:
(1)只要是可导出成员(变量首字母大写),都可以转成json。因成员变量sex是不可导出的,故无法转成json;
(2)如果变量打上了json标签,如Name旁边的 json:'name' ,那么转化成的json key就用该标签“name”,否则取字段名作为key,如'Age';
(3)指针变量,编码时自动转换为它所指向的值,如Class变量;
(4)强调一句,序列化成功后的json字符串是纯粹的字符串。
以上就是Golang 如何解析和生成json的详细内容,更多关于golang 解析、生成json的资料请关注好吧啦网其它相关文章!
相关文章: