go json解析

JSON转换库为 encoding/json

把对象转换为JSON的方法(函数)为 json.Marshal(),其函数原型如下

    func Marshal(v interface{}) ([]byte, error)

    也就是说,这个函数接收任意类型的数据 v,并转换为字节数组类型,返回值就是我们想要的JSON数据和一个错误代码。当转换成功的时候, 这个错误代码为nil






把 JSON 转换回对象的方法(函数)为 json.Unmarshal(),其函数原型如下

    func Unmarshal(data [] byte, v interface{}) error

    这个函数会把传入的 data 作为一个JSON来进行解析,解析后的数据存储在参数 v 中。这个参数 v 也是任意类型的参数(但一定是一个类型的指针)


b, err := json.Marshal(st)
if err != nil {
fmt.Println("json err:", err)
}
fmt.Println(string(b))

输出字段名的首字母都是大写的, 如果你想用小写的首字母怎么办呢?
必须通过struct tag定义来实现:

type Server struct {
ServerName string `json:" serverName"`
ServerIP string `json:" serverIP"`
}

type Serverslice struct {
Servers []Server `json:"servers"`
}
通过修改上面的结构体定义,输出的JSON串就和我们最开始定义的JSON串保持一致了。



json转成对象
stb := &Student{}
err = json.Unmarshal([]byte(strData), &stb)





请问这个短横线是什么关键字?

 Classes    []string
占位符,表示忽略下标


json_map := make(map[string] interface{})
err = json.Unmarshal(body, &json_map)


JSON是Javascript的一个子集
 JSON 文本(实际上是一个 []byte):





定义了与json数据对应的结构体
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)
}

struct字段( 首字母大写)
上面那种解析方式是在我们知晓被解析的JSON数据的结构的前提下采取的方案,如果我们不知道被解析的数据的格式,又应该如何来解析呢?


我们知道interface{}可以用来存储任意数据类型的对象,这种数据结构正好用于存储解析的未知结构的json数据的结果。JSON包中采用map[string]interface{}和[]interface{}结构来存储任意的JSON对象和数组。

现在我们假设有如下的JSON数据
b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}`)

如果在我们不知道他的结构的情况下,我们把他解析到interface{}里面
var f interface{}
err := json.Unmarshal(b, &f)

这个时候f里面存储了一个map类型,他们的key是string,值存储在空的interface{}里

f = map[string]interface{}{
"Name": "Wednesday",
"Age": 6,
"Parents": []interface{}{
"Gomez",
"Morticia",
},
}

如何来访问这些数据呢?通过断言的方式:

m := f.(map[string]interface{})
通过断言之后,你就可以通过如下方式来访问里面的数据了

for k, v := range m {
switch vv := v.(type) {
case string:
fmt.Println(k, "is string", vv)
case int:
fmt.Println(k, "is int", vv)
case float64:
fmt.Println(k,"is float64",vv)
case []interface{}:
fmt.Println(k, "is an array:")
for i, u := range vv {
fmt.Println(i, u)
}
default:
fmt.Println(k, "is of a type I don't know how to handle")
}
}
JSON对象只支持string作为key,所以要编码一个map,那么必须是map[string]T这种类型(T是Go语言中任意的类型)

猜你喜欢

转载自blog.csdn.net/elesos/article/details/79278489