1,解析到interface、 map
func ReadAllFileContent(fileName string) {
file, err := os.Open(fileName)
if err != nil {
log.Fatal(err)
}
defer file.Close()
// buf := make([]byte, 2024)
data, err := ioutil.ReadAll(file) //读取的结果是[]byte类型
if err != nil {
log.Fatal(err)
}
var result interface{}
err = json.Unmarshal(data, &result)
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
map_data := result.(map[string]interface{}) //interface如何转换为map:类型断言是类型安全的,并且只有当接口变量确实存储了你所期望的具体类型时才会成功。
for k, v := range map_data {
fmt.Println(k, v)
}
var result2 map[string]interface{}
err = json.Unmarshal(data, &result2)
if err != nil {
log.Fatal(err)
}
fmt.Println("-------------")
//一般写为如下形式
if map_data2, ok := result2["data"].(map[string]interface{}); ok {
fmt.Println(map_data2["name"])
}
}
打印结果:
msg ok
code 200
data map[age:18 name:张三 sex:男]
张三
注意:
1,读取文件使用ioutil.ReadAll,读取的结果是[]byte类型
data, err := ioutil.ReadAll(file)
2, json.Unmarshal将[]byte类型转换为interface, result是interface,使用的使用要类型转换
err = json.Unmarshal(data, &result)
map_data := result.(map[string]interface{})
interface如何转换为map:类型断言是类型安全的,并且只有当接口变量确实存储了你所期望的具体类型时才会成功。
2,解析到struct
type UserInfo struct {
Name string `json:"name"`
Age int `json:"age"`
Sex string `json:"sex"`
}
type resContent struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data UserInfo `json:"data"`
}
fmt.Println("-------------")
var result3 resContent
err = json.Unmarshal(data, &result3)
if err != nil {
log.Fatal(err)
}
fmt.Println(result3.Data.Name)
fmt.Println(result3.Code)
struct内部属性大写, 否则无法引用。
`json:"code"`后是json格式数据流中对应的名称,写对了可以直接对应。
struct中多字段,缺少对应json格式数据流中字段,不报错