首页 文章资讯内容详情

golang xml和json的解析与生成

2026-06-01 2 花语

本文内容纲要:

golang中解析xml时我们通常会创建与之对应的结构体,一层层嵌套,完成复杂的xml解析。

packagemain; import( "encoding/xml" "fmt" ) //我们通过定义一个结构体,来解析xml //注意,结构体中的字段必须是可导出的 typeBooksstruct{ //如果有类型为xml.Name的XMLName字段,则解析时会保存元素名到该字段 XMLNamexml.Name`xml:"books"`; //定义的字段中包含,attr,则解析时会把对应字段的属性值赋给该字段 Numsint`xml:"nums,attr"`; //定义的字段名含有xml中元素名,则解析时会把该元素值赋给该字段 Book[]Book`xml:"book"`; //字段类型为string或[]byte,并且包含,innerxml,则解析时会把此字段对应的元素内所有原始xml累加到字段上 Datastring`xml:",innerxml"`; //字段定义包含-,则解析时不会为该字段匹配任何数据 Tmpint`xml:"-"`; } typeBookstruct{ XMLNamexml.Name`xml:"book"`; Namestring`xml:"name,attr"`; Authorstring`xml:"author"`; Timestring`xml:"time"`; //字段定义如a>b>c,这样,解析时会从xml当前节点向下寻找元素并将值赋给该字段 Types[]string`xml:"types>type"`; //字段定义有,any,则解析时如果xml元素没有与任何字段匹配,那么这个元素就会映射到该字段 Teststring`xml:",any"`; } funcmain(){ //xml数据字符串 data:=`<?xmlversion="1.0"encoding="utf-8"?> <booksnums="2"> <bookname="思想"> <author>小张</author> <time>2018年1月20日</time> <types> <type>教育</type> <type>历史</type> </types> <test>我是多余的</test> </book> <bookname="政治"> <author>小王</author> <time>2018年1月20日</time> <types> <type>科学</type> <type>人文</type> </types> <test>我是多余的</test> </book> </books>`; //创建一个Books对象 bs:=Books{}; //把xml数据解析成bs对象 xml.Unmarshal([]byte(data),&bs); //打印bs对象中数据 fmt.Println(bs.XMLName); fmt.Println(bs.Nums); fmt.Println(bs.Tmp); //循环打印Book for_,v:=rangebs.Book{ fmt.Println(v.XMLName); fmt.Println(v.Name); fmt.Println(v.Author); fmt.Println(v.Time); fmt.Println(v.Types); fmt.Println(v.Test); } }

反之,通过创建结构体对象,生成xml数据

packagemain; import( "encoding/xml" "fmt" ) //注意,结构体中的字段必须是可导出的 typeBooksstruct{ XMLNamexml.Name`xml:"books"`; Numsint`xml:"nums,attr"`; Book[]Book`xml:"book"`; } typeBookstruct{ XMLNamexml.Name`xml:"book"`; Namestring`xml:"name,attr"`; Authorstring`xml:"author"`; Timestring`xml:"time"`; } funcmain(){ bs:=Books{Nums:666}; //通过append添加book数据 bs.Book=append(bs.Book,Book{Name:"小红",Author:"阿三",Time:"2018年6月3日"}); bs.Book=append(bs.Book,Book{Name:"小绿",Author:"阿四",Time:"2018年6月5日"}); //通过MarshalIndent,让xml数据输出好看点 data,_:=xml.MarshalIndent(&bs,"",""); fmt.Println(string(data)); }

json数据的解析,很多时候我们并不知道json的具体结构,这就需要我们灵活使用interface{}和类型断言来进行解析。

packagemain; import( "encoding/json" "fmt" ) //创建一个结构体,用来解析json //注意结构体中字段必须是可导出的 typePeoplestruct{ Namestring; Ageint; Sexstring; Love[]string; } funcmain(){ //这是一串json数据 //golang中json中的字段名也要加双引号,不然无法解析 data:=`{ "name":"小张", "age":27, "sex":"男", "love":["看书","旅游","健身"] }`; //我们创建一个people对象 p:=People{}; //解析到结构 json.Unmarshal([]byte(data),&p); fmt.Printf("%#v\n",p); fmt.Println(p.Name); fmt.Println(p.Age); fmt.Println(p.Sex); fmt.Println(p.Love); //解析到一个interface{} //golang中通过map[string]interface{}或[]interface{}来解析任意的对象和数组 varp2interface{}; json.Unmarshal([]byte(data),&p2); fmt.Printf("%#v\n",p2); //我们通过类型断言来访问数据 //先将p2转换成map[string]interface{}类型 p3:=p2.(map[string]interface{}); //然后遍历 fori,v:=rangep3{ switchvv:=v.(type){ casestring: fmt.Println(i,"string:",vv); caseint: fmt.Println(i,"int:",vv); case[]interface{}: //通过interface{}和类型断言,我们可以解析未知结构的json for_,vl:=rangevv{ fmt.Println(i,"[]interface{}:",vl); } } } }

通过结构体对象生成json数据

packagemain; import( "encoding/json" "fmt" ) //注意结构体的字段必须是可导出的 typeBookstruct{ //"name"表示指定json输出的名字 Namestring`json:"name"`; Authorstring`json:"author"`; Timestring`json:"time"`; //,string表示字段输出时会把字段值转成字符串 Numsint`json:"nums,string"`; //字段定义中有-,表示该字段不会输出到json Tempstring`json:"-"`; //,omitempty表示如果字段值为空,不会输出到json Emptystring`json:"empty,omitempty"`; } typeBookListstruct{ Books[]Book`json:"books"`; } funcmain(){ bl:=BookList{ Books:[]Book{ Book{Name:"一本书",Author:"小张",Time:"2018年1月20日",Nums:233,Temp:"临时",Empty:""}, Book{Name:"二本书",Author:"小王",Time:"2018年1月12日",Nums:233,Temp:"临时",Empty:"不为空"}, }, } data,_:=json.MarshalIndent(bl,"",""); fmt.Println(string(data)); }

本文内容总结:

原文链接:https://www.cnblogs.com/jkko123/p/8325813.html