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);
//循环打印Book
for _, 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{}和类型断言,我们可以解析未知结构的json
for _, 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"`;
//字段定义中有-,表示该字段不会输出到json
Temp string `json:"-"`;
//,omitempty表示如果字段值为空,不会输出到json
Empty 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的解析与生成的更多相关文章

  1. 10分钟掌握XML、JSON及其解析

    引言 NOKIA 有句著名的广告语:“科技以人为本”.任何技术都是为了满足人的生产生活需要而产生的.具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个人穷其一生也未必能掌 ...

  2. json的解析和生成

    相比于xml,json的主要特点是数据小,解析速度快,但是描述性差. java中常见的json解析方法有Gson.Jackson.JSON.simple. 从解析速度上来看,Gson适合解析小数据量, ...

  3. iOS高级编程之XML,JSON数据解析

    解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...

  4. (转)Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景

    自:http://www.xuanyusong.com/archives/1919 导出Unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平 ...

  5. 将场景导出XML或JSON或二进制而且解析还原场景

    导出unity场景的全部游戏对象信息,一种是XML一种是JSON. 本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平移与Prefab的名称导出在XML与JSON中.然后解析刚刚导出的XML或JSON ...

  6. Android基础总结(12)——XML和JSON解析

    XML和JSON解析 在网络上传输数据时最常用的格式有两种:XML和JSON.本文主要就是学习如何对这两种常用的数据格式进行解析. 1.XML和JSON的定义 XML:扩展标记语言 (Extensib ...

  7. [Network] HTML、XML和JSON学习汇总

    写在前面:楼主也是刚刚接触这方面的知识,之前完全是零基础,后来经朋友推荐了几个不错的博文,看完以后豁然开朗.但是此博文更加偏重于基础知识介绍(其实更深的楼主也还不了解,这方面的大神请绕道),只是分享个 ...

  8. iOS - JSON 数据解析

     iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...

  9. 用xml还是json

    1.定义介绍 (1).XML定义 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允 ...

随机推荐

  1. c# GC 新典型

    public class testGC : MonoBehaviour { class XDict<K, V> { public void TryGetValue(K key, V val ...

  2. oracle第四天笔记

    游标 /* 序列: ORACLE使用来模拟ID自动增长的 */ create sequence seq_test4; create table test2( tid number primary ke ...

  3. RabbitMQ.Net 应用(1)

    风浪子 概述 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Pu ...

  4. 【转】Classful IPv4 addressing definition

    Classful addressing definition Class Leadingbits Size of networknumber bit field Size of restbit fie ...

  5. 关于那个.get .post .ajax ztree 还有后台servlet传递数据

    servlet给前台传递data串 用的方法是 PrintWriter out = response.getWriter(); // response.sendRedirect("test. ...

  6. hexo发表博文的方式

    本图片转自:简书:https://www.jianshu.com/p/a52b68794a6b 转自github:https://blog.minhow.com

  7. mysql主从复制以及读写分离

    之前我们已经对LNMP平台的Nginx做过了负载均衡以及高可用的部署,今天我们就通过一些技术来提升数据的高可用以及数据库性能的提升. 一.mysql主从复制 首先我们先来看一下主从复制能够解决什么问题 ...

  8. yii2-ueditor

    扩展下载(yii2.0-ueditor) 框架下载(Yii 2.0.6 高级版) 描述: 最佳适用于yii2.0 高级版(advanced)应用框架,对于基础板(basic)及其他框架要修改对应的命名 ...

  9. 用pandas读取excel报错

    用pandas.read_execl()方法读取excel文件报错. 后来导入xlrd第三方库,就好了.

  10. Spring Boot 邮件配置

    ######################################################## spring boot mail tls ###################### ...