Go实践之JSON解析
28/Nov 2014
当我们开发了一个新版本的软件时,通常需要和稳定版进行对比,进行QoS评估。对实时性网络服务而言,比较客观的做法是同时请求相同的服务,然后对比返回结果。
首先,我们对一些常用的函数进行包裹,简化操作:
发送Http请求
func sendHttpRequest(url string) string {
response, _ := http.Get(url)
defer response.Body.Close()
var bodystr string
if response.StatusCode == 200 {
body, _ := ioutil.ReadAll(response.Body)
bodystr = string(body)
} else {
return ""
}
return bodystr
}
获取Json数据
如果你知道返回的json数据的格式,可以事先定义好对应的数据结构。例如json返回内容为
{
"name":"Monica",
"age": 10,
"hobby" : ["music", "dance"]
}
对应的数据结构和操作:
type Person struct {
name string `json:"name"`
age string `json:"age"`
hobby []string `json:"hobby"`
}
bodystr := sendHttpRequest(url)
var person Person
err := json.Unmarshal([]byte(bodystr), &person)
这样json内容就会变成一个实例化的Person对象,所有的json成员都会对应类型化。
如果我们不知道json数据格式怎么办? json的最外层肯定是一个map, 所以可以把json数据反序列化为一个通用的 interface{}
:
func getJson(url string) map[string]interface{} {
bodystr := sendHttpRequest(url)
var object interface{}
err := json.Unmarshal([]byte(bodystr), &object)
if err != nil {
return nil
} else {
return object.(map[string]interface{})
}
}
好处是通用,可以解析任意的json,但由于不知内层数据的类型,因此只作了最外层map的解析,返回数据的类型为map[string]interface{}
。之后可能会根据需要进行类型断言,转换等。
感觉json目前已经成了网络数据传输格式的事实标准,有很多人总结过JSON与XML的区别比较,我觉得json最大的优势是:程序员友好。json中的map, array, set, string, num都能完美地对应到某一编程语言中,即表示的不仅仅是文本,还是带类型的数据。而xml本质还是文本,要借助于xslt,scheme,属性等一堆东西实现json的类型化,表示成本高,解析成本也高。可能的好处是比较体系化,有成套的解决方案,用户可视化方便。