Files
build-web-application-with-…/7.2.md
2012-09-29 00:05:47 +08:00

60 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#7.2 JSON处理
JSONJavascript Object Notation是一种轻量级的数据交换语言以文字为基础具有自我描述性且易于让人阅读。尽管JSON是在Javascript的一个子集但JSON是独立于语言的文本格式并且采用了类似于C语言家族的一些习惯。JSON与XML最大的不同在于XML是一个完整的标记语言而JSON不是。JSON由于比XML更小、更快更易解析,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。目前我们看到很多的开放平台基本上所有的接口都是采用了JSON作为他们的数据交互。那么JSON在Web开发中如此重要Go语言对于JSON支持的怎么样呢其实Go语言的标准库里面已经非常好的支持了JSON可以对JSON包进行解析、生成JSON数据。
我们还是假设目前想要描述所有的服务器列表通过JSON如何来表达请看下面的描述
{"servers":[{"serverName":"Shanghai_VPN","serverIP":"127.0.0.1"},{"serverName":"Beijing_VPN","serverIP":"127.0.0.2"}]}
接下来的例子以此JSON数据为基础我们来进行JSON的解析和生成。
##解析JSON
###解析到结构体
假如有了上面的JSON串那么我们如何来解析这个JSON串呢Go的JSON包中有如下函数
func Unmarshal(data []byte, v interface{}) error
通过这个函数我们就可以实现解析的目的,详细的解析例子请看如下代码:
package main
import (
"encoding/json"
"fmt"
)
type Server struct {
ServerName string
ServerIP string
}
type Serverslice struct {
Servers []Server
}
func main() {
var s Serverslice
str := `{"servers":[{"serverName":"Shanghai_VPN","serverIP":"127.0.0.1"},{"serverName":"Beijing_VPN","serverIP":"127.0.0.2"}]}`
json.Unmarshal([]byte(str), &s)
fmt.Println(s)
}
通过上面的例子我们可以看到我们首先定义了结构体结构体和JSON的数据一一对应数组对应slice字段名对应JSON里面的KEY那么解析的时候如何解析到对应的字段的呢例如JSON的key是`Foo`,那么怎么找对应的字段呢?
- 首先查找字段的tag里面带有`Foo`的导出字段(首字母大写)
- 其次查找字段名是`Foo`的导出字段
- 最后查找类似`FOO`或者`FoO`这样的除了首字母之外其他大小写不敏感的导出字段
聪明的你一定注意到了一点能够输出的数据必须是导出字段其他字段是不能输出的。同时JSON解析的时候只会解析能找得到的字段如果找不到的字段会被忽略这样的一个好处是在于当你接收到一个很大的JSON数据的时候你如果只想部分数据那么用这种方式就可以轻松的解决了。
###解析到interface
我们知道上面哪种解析方式是当我们了解了JSON的数据结构的情况下来进行的解析那么如果我们在不知道JSON格式的情况下如何来解析JSON呢
##生成JSON
## links
* [目录](<preface.md>)
* 上一节: [XML处理](<7.1.md>)
* 下一节: [正则处理](<7.3.md>)
## LastModified
* $Id$