一、简介

JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。尽管JSON是Javascript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。目前我们看到很多的开放平台,基本上都是采用了JSON作为他们的数据交互的接口。既然JSON在Web开发中如此重要,那我们下面就来看看go对json的解析。

二、测试代码

1.将json转换为对象,这个我们在开发中开始很常用的,在开发中我们经常需要从文本或用户端接收一个json的字符串,将字符串转换为我们需要的对象,在我们的程序中使用,下面就展示go将json字符串转换为对象:

var jsonBlob = []byte(`[
    {"name": "Platypus", "order": "Monotremata","ID":1},
    {"name": "Quoll",    "order": "Dasyuromorphia","ID":2}
]`)
	// 在ID字段的json的注释中写成小写并不影响解析
	type Animal struct {
		ID    int    `json:"id"`
		Name  string `json:"name"`
		Order string `json:"order"`
	}
	var animals []Animal
	err := json.Unmarshal(jsonBlob, &animals)
	if err != nil {
		fmt.Println("error:", err)
	}
	fmt.Printf("%+v\n", animals)

上面的转换过程很简单,也可以不写后面的json的注释;

2.将对象转换为json字符串,在go中也又对应的方法将对象转换为json字符串:

// 第一种写法
// type ColorGroup struct {
	// 	ID     int
	// 	Name   string
	// 	Colors []string
	// }
	// group := ColorGroup{
	// 	ID:     1,
	// 	Name:   "社长",
	// 	Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
	// }
	// b, err := json.Marshal(group)
	// if err != nil {
	// 	fmt.Println("error:", err)
	// }
	// fmt.Println(string(b))

	// 第二种写法,控制字段名字的写法
	type ColorGroup struct {
		ID     int      `json:"id"`
		Name   string   `json:"name"`
		Colors []string `json:"color"`
	}

	group := ColorGroup{
		ID:     1,
		Name:   "社长",
		Colors: []string{"red", "Ruby", "Blue"},
	}
	b, err := json.Marshal(group)
	if err != nil {
		fmt.Println("error:", err)
	}
	fmt.Printf("the marshal result is %+v\n", string(b))

在上面的代码中,第一种写法是,将对象的字段名作为json的中字段的命名,第二种写法比较常见,我们可以控制字段转换为json后字段的名字,这样第一达到精确的控制。

3.下面再介绍另外一种解析json字符串的方式,使用json的decoder也可以将json转换为对象,这种方式适合转换数据量极大的json,是一种使用stream方式解析json字符串的方法:

const jsonStream = `
    {"Name": "Ed", "Text": "Knock knock."}
    {"Name": "Sam", "Text": "Who's there?"}
    {"Name": "Ed", "Text": "Go fmt."}
    {"Name": "Sam", "Text": "Go fmt who?"}
    {"Name": "Ed", "Text": "Go fmt yourself!"}
`
	type Message struct {
		Name, Text string
	}
	dec := json.NewDecoder(strings.NewReader(jsonStream))
	for {
		var m Message
		if err := dec.Decode(&m); err == io.EOF {
			break
		} else if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("%s: %s\n", m.Name, m.Text)
	}

strings.NewReader()是strings包中的一个方法,官方文档上面个说,这个方法和bytes.NewBufferString 很相似,但是更加高效并且是只读的,下面是原文,关于字符串处理的部分,由于字符串处理在我们的日常开发中是非常常见的,我们经常会用到,我们熟练掌握go的操作字符串的方法后,,我在后面出一期专门的教程,

NewReader returns a new Reader reading from s. It is similar to bytes.NewBufferString but more efficient and read-only.

以上就是go的json解析!!