Go-json解码到接口及根据键获取值
package mainimport ("encoding/json""fmt""github.com/bitly/go-simplejson"
)type JsonServer struct {ServerName stringServerIP string
}type JsonServers struct {Servers []JsonServer
}func main() {var s JsonServersstr := `{"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) //{[{Shanghai_VPN 127.0.0.1} {Beijing_VPN 127.0.0.2}]}b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}`)var f interface{}json.Unmarshal(b, &f)fmt.Printf("%+v\n", f) // map[Name:Wednesday Age:6 Parents:[Gomez Morticia]]m := f.(map[string]interface{})for k, v := range m {switch vv := v.(type) {case string:fmt.Println(k, "is string", vv) //Name is string Wednesdaycase int:fmt.Println(k, "is int", vv)case float64:fmt.Println(k, "is float64", vv) //Age is float64 6case []interface{}:fmt.Println(k, "is an array:") //Parents is an array://0 Gomez//1 Morticiafor i, u := range vv {fmt.Println(i, u)}default:fmt.Println(k, "is of a type I don't know how to handle")}}/**如您所见,我们现在可以通过interface{}解析未知格式的JSON并键入断言。以上示例是官方解决方案,但类型断言并不总是方便。因此,我推荐一个名为simplejson的开源项目,由bitly创建和维护。以下是如何使用此项目处理未知格式的JSON的示例:go get ithub.com/bitly/go-simplejson*/// 根据键获取值js, err := simplejson.NewJson([]byte(`{"test": {"array": [1, "2", 3],"int": 10,"float": 5.150,"bignum": 9223372036854775807,"string": "simplejson","bool": true}
}`))if err != nil {fmt.Println("err:", err)}arr, _ := js.Get("test").Get("array").Array() //arr: [1 2 3]fmt.Println("arr:", arr)i, _ := js.Get("test").Get("int").Int() //i: 10fmt.Println("i:", i)ms := js.Get("test").Get("string").MustString() //ms: simplejsonfmt.Println("ms:", ms)
}
json解码到接口
package mainimport ("encoding/json""fmt"
)func main() {jsonBuf := `{"company": "itcast","subjects": ["Go","C++","Python","Test"],"isok": true,"price": 666.666}`//创建一个mapm := make(map[string]interface{}, 4)err := json.Unmarshal([]byte(jsonBuf), &m)if err != nil {fmt.Println("err=", err)return}fmt.Println("m=", m) //m= map[company:itcast subjects:[Go C++ Python Test] isok:true price:666.666]fmt.Printf("m=%+v\n", m) //m=map[isok:true price:666.666 company:itcast subjects:[Go C++ Python Test]]var s strings = m["company"].(string)fmt.Println("s= ", s) //s= itcastvar s1 bools1 = m["isok"].(bool)fmt.Println("s1= ", s1) //s1= truevar s2 float64s2 = m["price"].(float64)fmt.Println("s2= ", s2) //s2= 666.666var str string//类型断言for key, value := range m {// fmt.Printf("%v===>%v\n", key, value)switch data := value.(type) {case string:str = datafmt.Printf("map[%s]的值类型为string,内容为%s\n", key, str)case bool:fmt.Printf("map[%s]的值类型为bool,内容为%v\n", key, data)case float64:fmt.Printf("map[%s]的值类型为float64,内容为%v\n", key, data)case []string:fmt.Printf("map[%s]的值类型为[]stiring1,内容为%v\n", key, data)case []interface{}:fmt.Printf("map[%s]的值类型为[]stiring2,内容为%v\n", key, data)}/*map[company]的值类型为string,内容为itcastmap[subjects]的值类型为[]stiring2,内容为[Go C++ Python Test]map[isok]的值类型为bool,内容为truemap[price]的值类型为float64,内容为666.666*/}
}