go json模块

encoding/json模块可将json格式字符串,转换为go struct类型
第一种情况:已知json格式
主要功能函数如下:
func Unmarshal(data []byte, v interface{}) error
函数第一个参数为字节数组,第二个参数为转换结果可以是任意类型,实现将json格式数据解析成对应结构体
数组对应slice, json的key对应结构体字段,能够被赋值的字段,首字母必须大写
使用如下:
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)
}
----------------------------------------------------------
输出为Serverslice类型:
结果:{[{Shanghai_VPN 127.0.0.1} {Beijing_VPN 127.0.0.2}]}
第二种情况:被解析的json数据格式不清楚
使用interface{}存储
package main

import (
"encoding/json"
"fmt"
)

func main() {
b := []byte(`{"Name": "Wednesday", "age": 6, "Parents": ["Gomez", "Morticia"]}`)
var f interface{}
err := json.Unmarshal(b, &f)
if err != nil{
fmt.Println(err)
}
fmt.Println(f)

}
--------------------------------------------------------------------
结果为Map类型:map[Name:Wednesday age:6 Parents:[Gomez Morticia]]
然后可以通过switch断言来访问这些数据。
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 []interface{}:
fmt.Println(k, "is a array:")
for i, u := range vv{
fmt.Println(i, u)
}
default:
fmt.Println(k, "is of a type I don't know how to hanle")
输出结果:

Name is string Wednesday
age is int 6
Parents is a array:
0 Gomez
1 Morticia

也可以使用第三方模块参考https://github.com/bitly/go-simplejson

猜你喜欢

转载自www.cnblogs.com/stay-foolisher/p/10829117.html