JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及浏览器的內建快速解析支持,使得其更适用于网络数据传输领域。

Golang自带的JSON解析库encoding/json,可以用起将结构化数据序列化成json字符串或从json字符串中解析出我们想要的数据。

1.解析json

给一个较为复杂的json字符串,包含数组,数组的元素是json对象。我们需要取出数组第一个元素中的某一个字段值。其它的解析均可参考下面的代码。

package main

import (

"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=%#v\n", 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=%T\n",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 booleans

float64代表JSON numbers

string代表JSON strings

nil 代表JSON null

2.生成json

假设我们有如下一个类(结构体)student 及其一个实例对象st,将其序列化为json,具体实现如下:

package main

import (

"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字符串是纯粹的字符串。