加入收藏 | 设为首页 | 会员中心 | 我要投稿 大连站长网 (https://www.0411zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

使用Golang解析Yaml、Json、Xml文件

发布时间:2021-11-03 04:47:43 所属栏目:语言 来源:互联网
导读:YAML(YAML 不是标记语言)是一种人类可读的数据序列化语言。它通常用于配置文件,但也用于数据存储或传输。YAML 本身支持三种基本数据类型:标量(例如字符串、整数和浮点数)、列表和映射(字典/哈希)。我们使用 yaml.v3 包来解析yaml文件go get gopkg.in/yaml
YAML(YAML 不是标记语言)是一种人类可读的数据序列化语言。它通常用于配置文件,但也用于数据存储或传输。YAML 本身支持三种基本数据类型:标量(例如字符串、整数和浮点数)、列表和映射(字典/哈希)。我们使用 yaml.v3 包来解析yaml文件   go get gopkg.in/yaml.v3  解析yaml   func Unmarshal(in []byte, out interface{}) (err error)  我们使用 Unmarshal来解析yaml yaml文件内容如下:   - name: wanger    age: 24    address: beijing    hobby:      - literature      - social  - name: 冬哥    age: 30    address: chengdu    hobby:      - basketball      - guitar  - name: 华子    age: 27    address: shenzhen    hobby:      - 王者荣耀  - name: 乔克    age: 29    address: chongqing    hobby:      - 阅读      - 王者荣耀  - name: 夏老师    age: 27    address: chengdu    hobby:      - 吃吃喝喝  - name: 姜总    age: 25    address: shanghai    hobby:      - talkshow  - name: 郑哥    age: 30    address: beijing    hobby:      - 阅读      - 复读机  读取test.yaml   package main    import (   "fmt"   "gopkg.in/yaml.v2"   "io/ioutil"   "gopkg.in/yaml.v3"   "log"  )        type Users struct {   Name   string      `yaml:"name"`   Age    int8        `yaml:"age"`   Address  string `yaml:"address"`   Hobby []string `yaml:"hobby"`  }      func main() {     file, err := ioutil.ReadFile("test.yaml")   if err != nil {    log.Fatal(err)   }   var data [7]Users   err2 := yaml.Unmarshal(file, &data)     if err2 != nil {    log.Fatal(err2)   }   for _, v := range data {    fmt.Println(v)   }  }  输出内容如下   {wanger 24 beijing [literature social]}  {冬哥 30 chengdu [basketball guitar]}  {华子 27 shenzhen [王者荣耀]}  {乔克 29 chongqing [阅读 王者荣耀]}  {夏老师 27 chengdu [吃吃喝喝]}  {姜总 25 shanghai [钓鱼  音乐 美食  酒talkshow]}  {郑哥 30 beijing [阅读 复读机]}  生成yaml func Marshal(in interface{}) (out []byte, err error)  我们使用 Marshal来生成yaml,生成一个关于我们团队信息的yaml文件吧 可以通过定义结构体yaml标签来自定义输出的yaml文件的键名   package main    import (   "fmt"   "gopkg.in/yaml.v3"  )        type Users struct {   Name   string      `yaml:"name"`   Age    int8        `yaml:"age"`   Address  string `yaml:"address"`   Hobby []string `yaml:"hobby"`  }      func main() {   wanger := Users{    Name: "wanger",    Age:  24,    Address: "beijing",    Hobby: []string{"literature", "social"},   }   dongdong := Users{    Name: "冬哥",    Age:  30,    Address: "chengdu",    Hobby: []string{"basketball", "guitar"},   }   xialaoshi := Users{    Name: "夏老师",    Age:  29,    Address: "chengdu",    Hobby: []string{"吃吃喝喝"},   }   huazai := Users{    Name: "华子",    Age:  28,    Address: "shenzhen",    Hobby: []string{"王者荣耀"},   }   qiaoke := Users{    Name: "乔克",    Age:  30,    Address: "chongqing",    Hobby: []string{"阅读", "王者荣耀"},   }   jiangzong := Users{    Name: "姜总",    Age:  25,    Address: "shanghai",    Hobby: []string{"钓鱼","音乐","美食","酒"},   }   zhengge := Users{    Name: "郑哥",    Age:  30,    Address: "beijing",    Hobby: []string{"阅读", "复读机"},   }      userlist:=[7]Users{wanger,dongdong,huazai,qiaoke,xialaoshi,jiangzong,zhengge}     yamlData, err := yaml.Marshal(&userlist)     if err != nil {    fmt.Printf("Error while Marshaling. %v", err)   }     fmt.Println(string(yamlData))      fileName := "test.yaml"      err = ioutil.WriteFile(fileName, yamlData, 0644)      if err != nil {          panic("Unable to write data into the file")      }  }      生成的yaml信息如下   - name: wanger    age: 24    address: beijing    hobby:      - literature      - social  - name: 冬哥    age: 30    address: chengdu    hobby:      - basketball      - guitar  - name: 华子    age: 27    address: shenzhen    hobby:      - 王者荣耀  - name: 乔克    age: 29    address: chongqing    hobby:      - 阅读      - 王者荣耀  - name: 夏老师    age: 27    address: chengdu    hobby:      - 吃吃喝喝  - name: 姜总    age: 25    address: shanghai    hobby:      - 钓鱼        - 音乐      - 美食       - 酒  - name: 郑哥    age: 30    address: beijing    hobby:      - 阅读      - 复读机  解析和生成json文件 我们使用encoding/json标准库包来实现json文件的解析与生成   读取和解析json文件   func Unmarshal(data []byte, v interface{}) error  我这里定义了一个user.json文件   {    "users": [      {        "name": "wanger",        "address": "beijing",        "age": 24,        "social": {          "mobile": "111111111",          "email": "wanger@163.com"        }      },      {        "name": "dongdong",        "address": "chengdu",        "age": 30,        "social": {          "mobile": "2222222222222222",          "emial": "dongdong@163.com"        }      },      {        "name": "夏老师",        "address": "chengdu",        "age": 29,        "social": {          "mobile": "2232222222222222",          "emial": "xialaoshi@163.com"        }      },      {        "name": "郑哥",        "address": "beijing",        "age": 30,        "social": {          "mobile": "12222211111",          "email": "zhengge@163.com"        }      },      {        "name": "姜总",        "address": "shanghai",        "age": 25,        "social": {          "mobile": "111122211",          "email": "jaingzong@163.com"        }      },      {        "name": "乔克",        "address": "chongqing",        "age": 30,        "social": {          "mobile": "11333331111111",          "email": "qiaoke@163.com"        }      },      {        "name": "华仔",        "address": "shenzhen",        "age": 28,        "social": {          "mobile": "113311111",          "email": "huazai@163.com"        }      }    ]  }  读取user.json文件   package main    import (   "encoding/json"   "fmt"   "io/ioutil"   "os"   "strconv"  )  func main() {   jsonFile,err:=os.Open("user.json")   if err != nil {    fmt.Println(err)   }   fmt.Println("Successfully Opened users.json")   defer jsonFile.Close()   byteValue,_:=ioutil.ReadAll(jsonFile)   var users Users   json.Unmarshal(byteValue,&users)   for i :=0;i<len(users.Users);i++ {    fmt.Println("User Type: "+ users.Users[i].Address)    fmt.Println("User Age: "+strconv.Itoa(users.Users[i].Age))    fmt.Println("User Name: "+users.Users[i].Name)    fmt.Println("User Email: "+users.Users[i].Social.Email)   }   var result Users   json.Unmarshal(byteValue,&result)  }  type Users struct {   Users []User `json:"users"`  }  type User struct {   Name string `json:"name"`   Address string `json:"address"`   Age int `json:"Age"`   Social Social `json:"social"`  }  type Social struct {   Mobile string `json:"mobile"`   Email string `json:"email"`  }  输出结果如下   Successfully Opened users.json  User Type: beijing  User Age: 24  User Name: wanger  User Email: wanger@163.com  User Type: chengdu  User Age: 30  User Name: dongdong  User Email:   User Type: chengdu  User Age: 28  User Name: 夏老师  User Email:   User Type: beijing  User Age: 30  User Name: 郑哥  User Email: zhengge@163.com  User Type: shanghai  User Age: 25  User Name: 姜总  User Email: jaingzong@163.com  User Type: chongqing  User Age: 29  User Name: 乔克  User Email: qiaoke@163.com  User Type: shenzhen  User Age: 28  User Name: 华仔  User Email: huazai@163.com  当然有时候我们可能不知道要读取的json数据结构,这就没办法预定义结构体,那么我们可以使用**map[string]interface{}**类型来解析json。   var result map[string]interface{}  err = json.Unmarshal(byteValue, &result)  fmt.Printf("%+vn", result)  输出信息如下:   map[users:[map[address:beijing age:24 name:wanger social:map[email:wanger@163.com mobile:111111]] map[address:chengdu age:30 name:dongdong social:map[emial:dongdong@163.com mobil222222222222222]] map[address:chengdu age:28 name:夏老师 social:map[emial:xialaoshi@163.cmobile:2232222222222222]] map[address:beijing age:30 name:郑哥 social:map[email:zhengge@1com mobile:12222211111]] map[address:shanghai age:25 name:姜总 social:map[email:jaingzong3.com mobile:111122211]] map[address:chongqing age:29 name:乔克 social:map[email:qiaoke@1com mobile:11333331111111]] map[address:shenzhen age:28 name:华仔 social:map[email:huazai3.com mobile:113311111]]]]  生成json文件   func Marshal(v interface{}) ([]byte, error)  package main    import (   "encoding/json"   "fmt"   "io/ioutil"  )    func main() {   wanger:=User{Address:"beijing",Name:"wanger",Age:24,Social:Social{Email:"wanger@163.com",Mobile:"111111111111"}}   huazi:=User{Address:"shenzhen",Name:"huazai",Age:28,Social:Social{Email:"huazai@163.com",Mobile:"111122211111"}}   qiaoke:=User{Address:"chongqing",Name:"qiaoke",Age:30,Social:Social{Email:"qiaoke@163.com",Mobile:"13332211111"}}   xialaoshi:=User{Address:"chengdu",Name:"夏老师",Age:29,Social:Social{Email:"xialaoshi@163.com",Mobile:"11144445411111"}}   jiangzong:=User{Address:"shanghai",Name:"姜总",Age:25,Social:Social{Email:"jiangzong@163.com",Mobile:"111222445211111"}}   dongdong:=User{Address:"chengdu",Name:"冬哥",Age:30,Social:Social{Email:"dongdong@163.com",Mobile:"1155555211111"}}   zhengge:=User{Address:"beijing",Name:"郑哥",Age:24,Social:Social{Email:"zhengge@163.com",Mobile:"1112224566211111"}}   result:=Users{Users: []User{wanger,huazi,jiangzong,xialaoshi,qiaoke,dongdong,zhengge}}   bytearray,err:=json.Marshal(result)   if err!=nil {    fmt.Println(err)   }   fmt.Println(string(bytearray))   fileName := "user.json"   err = ioutil.WriteFile(fileName, bytearray, 0644)   if err != nil {    panic("Unable to write data into the file")   }  }  type Users struct {   Users []User `json:"users"`  }  type User struct {   Name string `json:"name"`   Address string `json:"address"`   Age int `json:"Age"`   Social Social `json:"social"`  }  type Social struct {   Mobile string `json:"mobile"`   Email string `json:"email"`  }  输出内容如下   {"users":[{"name":"wanger","address":"beijing","Age":24,"social":{"mobile":"111111111111","email":"wanger@163.com"}},{"name":"huazai","address":"shenzhen","Age":28,"social":{"mobile":"111122211111","email":"huazai@163.com"}},{"name":"姜总","address":"shanghai","Age":25,"social":{"mobile":"111222445211111","email":"jiangzong@163.com"}},{"name":"夏老师","address":"chengdu","Age":29,"social":{"mobile":"11144445411111","email":"xialaoshi@163.com"}},{"name":"qiaoke","address":"chongqing","Age":30,"social":{"mobile":"13332211111","email":"qiaoke@163.com"}},{"name":"冬哥","address":"chengdu","Age":30,"social":{"mobile":"1155555211111","email":"dongdong@163.com"}},{"name":"郑哥","address":"beijing","Age":24,"social":{"mobile":"1112224566211111","email":"zhengge@163.com"}}]}  可以看出上面输出的json并不是很美观,可以使用更易读的函数**json.MarshalIndent()**函数,MarshalIndent()可以定义输出的前缀和缩进   bytearray,err:=json.MarshalIndent(result,""," ")  if err!=nil {   fmt.Println(err)  }  fmt.Println(string(bytearray))  输出内容如下,比之前看起来好多了   {   "users": [    {     "name": "wanger",     "address": "beijing",     "Age": 24,     "social": {      "mobile": "111111111111",      "email": "wanger@163.com"     }    },    {     "name": "huazai",     "address": "shenzhen",     "Age": 28,     "social": {      "mobile": "111122211111",      "email": "huazai@163.com"     }    },    {     "name": "姜总",     "address": "shanghai",     "Age": 25,     "social": {      "mobile": "111222445211111",      "email": "jiangzong@163.com"     }    },    {     "name": "夏老师",     "address": "chengdu",     "Age": 29,     "social": {      "mobile": "11144445411111",      "email": "xialaoshi@163.com"     }    },    {     "name": "qiaoke",     "address": "chongqing",     "Age": 30,     "social": {      "mobile": "13332211111",      "email": "qiaoke@163.com"     }    },    {     "name": "冬哥",     "address": "chengdu",     "Age": 30,     "social": {      "mobile": "1155555211111",      "email": "dongdong@163.com"     }    },    {     "name": "郑哥",     "address": "beijing",     "Age": 24,     "social": {      "mobile": "1112224566211111",      "email": "zhengge@163.com"     }    }   ]  }  解析和生成xml文件 解析xml文件   func Unmarshal(data []byte, v interface{}) error  定义一个user.xml文件   <?xml version="1.0" encoding="UTF-8"?>  <users>      <user address="beijing">          <name>wanger</name>          <age>24</age>          <social>              <email>wanger@163.com</email>              <mobile>1233455464</mobile>          </social>      </user>      <user address="chengdu">          <name>冬哥</name>          <age>30</age>          <social>              <email>dongge@163.com</email>              <mobile>12245555464</mobile>          </social>      </user>      <user address="chengdu">          <name>夏老师</name>          <age>29</age>          <social>              <email>xialaoshi@163.com</email>              <mobile>12335677464</mobile>          </social>      </user>      <user address="beijing">          <name>郑哥</name>          <age>30</age>          <social>              <email>zhengge@163.com</email>              <mobile>12334355464</mobile>          </social>      </user>      <user address="shanghai">          <name>姜总</name>          <age>25</age>          <social>              <email>jiangzong@163.com</email>              <mobile>123565455464</mobile>          </social>      </user>      <user address="chongqing">          <name>乔克</name>          <age>29</age>          <social>              <email>qiaoke@163.com</email>              <mobile>124676755464</mobile>          </social>      </user>      <user address="shenzhen">          <name>华仔</name>          <age>28</age>          <social>              <email>huazai@163.com</email>              <mobile>1238655464</mobile>          </social>      </user>  </users>  解析xml文件 address,attr意味着该address字段是一个XML属性而不是一个嵌套元素。如果结构体有一个名为 XMLName 的 Name 类型的字段,Unmarshal 在该字段中记录元素名称。   为了正确解析,go 语言的 xml 包要求 struct 定义中的所有字段必须是可导出的(即首字母大写)   package main    import (   "encoding/xml"   "fmt"   "io/ioutil"   "os"  )  func main() {     xmlFile,err:=os.Open("users.xml")   if err!=nil {    fmt.Println(err)   }   fmt.Println("successfully opened users.xml")   defer xmlFile.Close()   byteValue,_:=ioutil.ReadAll(xmlFile)   var users Users   xml.Unmarshal(byteValue,&users)   for i :=0;i<len(users.Users);i++ {    fmt.Println("User Address: "+users.Users[i].Address)    fmt.Println("User Name: "+users.Users[i].Name)    fmt.Println("Facebook Url: "+users.Users[i].Social.Email)   }  }  type Users struct {   XMLName xml.Name `xml:"users"`   Users []User `xml:"user"`  }    type User struct {   XMLName xml.Name `xml:"user"`   Address string `xml:"address,attr"`   Name string `xml:"name"`   Social Social `xml:"social"`  }  type Social struct {   XMLName xml.Name `xml:"social"`   Mobile string `xml:"mobile"`   Email string `xml:"email"`  }  输出结果如下:   successfully opened users.xml  User Address: beijing  User Name: wanger  Facebook Url: wanger@163.com  User Address: chengdu  User Name: 冬哥  Facebook Url: dongge@163.com  User Address: chengdu  User Name: 夏老师  Facebook Url: xialaoshi@163.com  User Address: beijing  User Name: 郑哥  Facebook Url: zhengge@163.com  User Address: shanghai  User Name: 姜总  Facebook Url: jiangzong@163.com  User Address: chongqing  User Name: 乔克  Facebook Url: qiaoke@163.com  User Address: shenzhen  User Name: 华仔  Facebook Url: huazai@163.com  生成xml文件   func Marshal(v interface{}) ([]byte, error)  func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)  可以使用Marshal()函数和MarshalIndent()函数,之前的json和yaml包里也有用到,区别就是MarshalIndent()可以添加 前缀和缩进,看起来更美观一点,Marshal 和MarshalIndent通过编写一个或多个包含数据的 XML 元素来处理所有其他数据。   package main    import (   "encoding/xml"   "fmt"   "io/ioutil"  )  func main() {   wanger:=User{Address:"beijing",Name:"wanger",Age:24,Social:Social{Email:"wanger@163.com",Mobile:"111111111111"}}   huazi:=User{Address:"shenzhen",Name:"huazai",Age:28,Social:Social{Email:"huazai@163.com",Mobile:"111122211111"}}   qiaoke:=User{Address:"chongqing",Name:"qiaoke",Age:30,Social:Social{Email:"qiaoke@163.com",Mobile:"13332211111"}}   xialaoshi:=User{Address:"chengdu",Name:"夏老师",Age:29,Social:Social{Email:"xialaoshi@163.com",Mobile:"11144445411111"}}   jiangzong:=User{Address:"shanghai",Name:"姜总",Age:25,Social:Social{Email:"jiangzong@163.com",Mobile:"111222445211111"}}   dongdong:=User{Address:"chengdu",Name:"冬哥",Age:30,Social:Social{Email:"dongdong@163.com",Mobile:"1155555211111"}}   zhengge:=User{Address:"beijing",Name:"郑哥",Age:24,Social:Social{Email:"zhengge@163.com",Mobile:"1112224566211111"}}      v:=&Users{Users: []User{wanger,huazi,qiaoke,xialaoshi,zhengge,jiangzong,dongdong}}     result, err := xml.MarshalIndent(v, "  ", "    ")   if err != nil {    fmt.Printf("error: %vn", err)   }   fmt.Println(string(result))   fileName := "users.xml"   err = ioutil.WriteFile(fileName, result, 0644)   if err != nil {    panic("Unable to write data into the file")   }  }  type Users struct {   XMLName xml.Name `xml:"users"`   Users []User `xml:"user"`  }    type User struct {   XMLName xml.Name `xml:"user"`   Age int64 `xml:"age"`   Address string `xml:"address,attr"`   Name string `xml:"name"`   Social Social `xml:"social"`  }  type Social struct {   XMLName xml.Name `xml:"social"`   Mobile string `xml:"mobile"`   Email string `xml:"email"`  }  输出信息如下   <users>       <user address="beijing">           <age>24</age>           <name>wanger</name>           <social>               <mobile>111111111111</mobile>               <email>wanger@163.com</email>           </social>       </user>       <user address="shenzhen">           <age>28</age>           <name>huazai</name>           <social>               <mobile>111122211111</mobile>               <email>huazai@163.com</email>           </social>       </user>       <user address="chongqing">           <age>30</age>           <name>qiaoke</name>           <social>               <mobile>13332211111</mobile>               <email>qiaoke@163.com</email>           </social>       </user>       <user address="chengdu">           <age>29</age>           <name>夏老师</name>           <social>               <mobile>11144445411111</mobile>               <email>xialaoshi@163.com</email>           </social>       </user>       <user address="beijing">           <age>24</age>           <name>郑哥</name>           <social>               <mobile>1112224566211111</mobile>               <email>zhengge@163.com</email>           </social>       </user>       <user address="shanghai">           <age>25</age>           <name>姜总</name>           <social>               <mobile>111222445211111</mobile>               <email>jiangzong@163.com</email>           </social>       </user>       <user address="chengdu">           <age>30</age>           <name>冬哥</name>           <social>               <mobile>1155555211111</mobile>               <email>dongdong@163.com</email>           </social>       </user>   </users> 

(编辑:大连站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!