golang xml和json的解析与生成
golang中解析xml时我们通常会创建与之对应的结构体,一层层嵌套,完成复杂的xml解析。
package main;import ("encoding/xml""fmt" )//我们通过定义一个结构体,来解析xml //注意,结构体中的字段必须是可导出的 type Books struct {//如果有类型为xml.Name的XMLName字段,则解析时会保存元素名到该字段XMLName xml.Name `xml:"books"`;//定义的字段中包含,attr,则解析时会把对应字段的属性值赋给该字段Nums int `xml:"nums,attr"`;//定义的字段名含有xml中元素名,则解析时会把该元素值赋给该字段Book []Book `xml:"book"`;//字段类型为string或[]byte,并且包含,innerxml,则解析时会把此字段对应的元素内所有原始xml累加到字段上Data string `xml:",innerxml"`;//字段定义包含-,则解析时不会为该字段匹配任何数据Tmp int `xml:"-"`; }type Book struct {XMLName xml.Name `xml:"book"`;Name string `xml:"name,attr"`;Author string `xml:"author"`;Time string `xml:"time"`;//字段定义如a>b>c,这样,解析时会从xml当前节点向下寻找元素并将值赋给该字段Types []string `xml:"types>type"`;//字段定义有,any,则解析时如果xml元素没有与任何字段匹配,那么这个元素就会映射到该字段Test string `xml:",any"`; }func main() {//xml数据字符串data := `<?xml version="1.0" encoding="utf-8"?><books nums="2"><book name="思想"><author>小张</author><time>2018年1月20日</time><types><type>教育</type><type>历史</type></types><test>我是多余的</test></book><book name="政治"><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);//循环打印Bookfor _, v := range bs.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数据
package main;import ("encoding/xml""fmt" )//注意,结构体中的字段必须是可导出的 type Books struct {XMLName xml.Name `xml:"books"`;Nums int `xml:"nums,attr"`;Book []Book `xml:"book"`; }type Book struct {XMLName xml.Name `xml:"book"`;Name string `xml:"name,attr"`;Author string `xml:"author"`;Time string `xml:"time"`; }func main() {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{}和类型断言来进行解析。
package main;import ("encoding/json""fmt" )//创建一个结构体,用来解析json //注意结构体中字段必须是可导出的 type People struct {Name string;Age int;Sex string;Love []string; }func main() {//这是一串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{}来解析任意的对象和数组var p2 interface{};json.Unmarshal([]byte(data), &p2);fmt.Printf("%#v\n", p2);//我们通过类型断言来访问数据//先将p2转换成map[string]interface{}类型p3 := p2.(map[string]interface{});//然后遍历for i, v := range p3 {switch vv := v.(type) {case string:fmt.Println(i, "string: ", vv);case int:fmt.Println(i, "int: ", vv);case []interface{}://通过interface{}和类型断言,我们可以解析未知结构的jsonfor _, vl := range vv {fmt.Println(i, "[]interface{}: ", vl);}}} }
通过结构体对象生成json数据
package main;import ("encoding/json""fmt" )//注意结构体的字段必须是可导出的 type Book struct {//"name"表示指定json输出的名字Name string `json:"name"`;Author string `json:"author"`;Time string `json:"time"`;//,string表示字段输出时会把字段值转成字符串Nums int `json:"nums,string"`;//字段定义中有-,表示该字段不会输出到jsonTemp string `json:"-"`;//,omitempty表示如果字段值为空,不会输出到jsonEmpty string `json:"empty,omitempty"`; }type BookList struct {Books []Book `json:"books"`; }func main() {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)); }
golang xml和json的解析与生成相关推荐
- 转:10分钟掌握XML、JSON及其解析
10分钟掌握XML.JSON及其解析 转载于:https://www.cnblogs.com/kira2will/p/4086047.html
- iOS进阶(XML、JSON数据解析)
1.XML解析之DOM解析 需要用到libxml2.dylib框架 和GDataXMLNode工具 DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中.从而消耗很大的内存空间.DOM ...
- golang(8):使用golang 的 encoding/json 做解析,然后转换成 create sql
前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/88837310 未经博主允许不得转载. 博主地址是:http://blog ...
- spark中读取json_【spark】文件读写和JSON数据解析
1.读文件 通过 sc.textFile("file://")方法来读取文件到rdd中. val lines = sc.textFile("file://")/ ...
- Golang json 解析与生成
文章目录 1.解析 json 1.1 map[string]interface{} 存储 json 1.2 struct 存储 json 1.3 []map[string]interface{} 解析 ...
- XML与JSON的生成与解析
1. XML 1.1 XML简介 可标记语言(extensible Markup Language) 特性: XML具有平台无关性,是一门独立的语言 XML具有自我描述性 XML功能: 网络传输文件 ...
- JavaSE——XML与JSON(语法格式、解析内容)
第6节 XML与JSON 一.XML 1.1 XML简介 XML全称为可扩展标记语言(extensible Markup Language) . 特性: xml具有平台无关性,是一门独立的标记语言: ...
- C#合成解析XML与JSON
http://www.xuanyusong.com/archives/1901 XML与JSON在开发中非常重要, 其实核心就是处理字符串.一个是XML的字符串一个是JSON的字符串,尤其是在处 ...
- Python 解析构建数据大杂烩 -- csv、xml、json、excel
Python 可以通过各种库去解析我们常见的数据.其中 csv 文件以纯文本形式存储表格数据,以某字符作为分隔值,通常为逗号:xml 可拓展标记语言,很像超文本标记语言 Html ,但主要对文档和数据 ...
最新文章
- 亚马逊ses如何发qq_使用Amazon SES发送电子邮件
- 正则表达式中^的用法
- C#GDI+编程基础
- 干货分享:什么是Java设计工厂模式?
- 如何使用PyCharm调试Python代码
- 【转载】:单例设计模式
- iPhone13真香了?苹果官网被抢崩了,连夜补货!粉色或成爆款..
- 牛客 —— 湖南大学第十六届程序设计竞赛(重现赛)
- day17【前台】支付案例
- 什么是Apache Flink
- 2020年 福建物联网产值或达千亿
- 雷林鹏分享:PHP 表单 - 验证邮件和URL
- 【转】从CSDN的趣味题学C# 3.0
- 《人.地.城》读书笔记
- CEO如何选拔和留住数字化人才
- Copy ‘XXXX‘ to effectively final temp variable
- (转)Spring事务异常回滚机制(出处在文末,转自李慕白大神)
- NLog NETCore 3.0 Porting
- 从数码宝贝看spring bean的生命周期
- Vue + vite 切换 favicon图标