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

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

发布时间:2022-11-26 12:39:03 所属栏目:语言 来源:
导读:  大家好,我是wanger。
  
  解析和生成yaml文件
  YAML(YAML 不是标记语言)是一种人类可读的数据序列化语言。它通常用于配置文件,但也用于数据存储或传输。YAML 本身支持三种基本数据类型:标量(例如

  大家好,我是wanger。
  
  解析和生成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("%+v\n", 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文件
 

(编辑:财气旺网 - 财气网)

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