go语言解码未知结构的JSON数据

go语言解码未知结构的JSON数据

http://c.biancheng.net/view/4524.html

在前面介绍接口的时候,我们提到基于Go语言的面向对象特性,可以通过空接口来表示任何类型,这同样也适用于对未知结构的 JSON 数据进行解码,只需要将这段 JSON 数据解码输出到一个空接口即可。

在实际解码过程中,JSON 结构里边的数据元素将做如下类型转换:

布尔值将会转换为Go语言的 bool 类型;

数值会被转换为Go语言的 float64 类型;

字符串转换后还是 string 类型;

JSON 数组会转换为 []interface{} 类型;

JSON 对象会转换为 map[string]interface{} 类型;

null 值会转换为 nil。

在Go语言标准库 encoding/json 中,可以使用map[string]interface{}和[]interface{}类型的值来分别存放未知结构的 JSON 对象或数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func main(){
u3 := []byte(`{"name":"helloworld","website":"http://google.com","course":["go","php","c++","java"]}`)
var u4 interface{}
err := json.Unmarshal(u3,&u4)
if err != nil{
fmt.Println("json unmarshal failed",err)
return
}
u5 := u4.(map[string]interface{})
for k,v := range u5{
switch v2 := v.(type) {
case string:
fmt.Println("string",k,v,v2)
case int:
fmt.Println("int",k,v,v2)
case []interface{}:
for i,iv := range v2 {
fmt.Println("[]interface{}", i, iv, k, v, v2)
}
}
}
}