本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
使用Golang解析Yaml、Json、Xml文件
我是陈晓 · 330浏览 · 发布于2021-09-30 +关注

YAML(YAML 不是标记语言)是一种人类可读的数据序列化语言。它通常用于配置文件,但也用于数据存储或传输。YAML 本身支持三种基本数据类型:标量(例如字符串、整数和浮点数)、列表和映射(字典/哈希)。

解析和生成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文件

                                                                           golang
                                                                         

                                        相关推荐

                                        PHP实现部分字符隐藏

                                        沙雕mars · 1325浏览 · 2019-04-28 09:47:56
                                        Java中ArrayList和LinkedList区别

                                        kenrry1992 · 908浏览 · 2019-05-08 21:14:54
                                        Tomcat 下载及安装配置

                                        manongba · 970浏览 · 2019-05-13 21:03:56
                                        JAVA变量介绍

                                        manongba · 962浏览 · 2019-05-13 21:05:52
                                        什么是SpringBoot

                                        iamitnan · 1086浏览 · 2019-05-14 22:20:36
                                        加载中

                                        0评论

                                        评论
                                        我是一名在上海一家互联网公司上班,专注技术开发工作等。
                                        小鸟云服务器
                                        扫码进入手机网页