怀抱观古今,寝食展戏谑。这篇文章主要讲述使用golang解析yamljsonxml文件相关的知识,希望能为你提供帮助。
解析和生成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 mainimport (
"fmt"
"gopkg.in/yaml.v2"
"io/ioutil"
"gopkg.in/yaml.v3"
"log"
)type Users struct {
Namestring`yaml:"name"`
Ageint8`yaml:"age"`
Addressstring `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 mainimport (
"fmt"
"gopkg.in/yaml.v3"
)type Users struct {
Namestring`yaml:"name"`
Ageint8`yaml:"age"`
Addressstring `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 mainimport (
"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 mainimport (
"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 在该字段中记录元素名称。
package mainimport (
"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 mainimport (
"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: %v\\n", 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>
【使用golang解析yamljsonxml文件】
文章图片
推荐阅读
- 09 bootstrap快速搭建前端
- 04 django 框架路由分发,反向解析,上传文件,
- canal1.1.5 配置kafka
- 01 django框架基础
- 性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控
- 在WordPress中使用add_shortcode()在主页中创建内容section
- 在timber/twig主题中使用WordPress自定义标题图像
- 将WP更新到Salient主题中的5.0.2之后,使用Classic Visual Composer代码
- 对子类别使用不同的模板