首页 > 其他分享 >go语言学习-json和xml

go语言学习-json和xml

时间:2023-03-26 22:08:17浏览次数:46  
标签:xml string err fmt Println json go Marshal

JSON

  • json是完全独立于语言的文本格式,是k-v的形式 name:zs
  • 应用场景:前后端交互,系统间数据交互
  • json使用go语言内置的encoding/json 标准库
  • 编码json使用json.Marshal()函数可以对一组数据进行JSON格式的编码

通过结构体生成json

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name  string
	Hobby string
}

func main() {
	//实例化一个结构体
	p := Person{"yangchao", "playgame"}
	//编码json
	b, err := json.Marshal(p)
	if err != nil {
		fmt.Println("json err", err)
	}
	fmt.Println(string(b))

	//格式化输出
	b, err = json.MarshalIndent(p, "", "		")
	if err != nil {
		fmt.Println("json err", err)
	}
	fmt.Println(string(b))
}

序列化和反序列化

package main

import (
	"encoding/json"
	"fmt"
)

/* go语言中使用官方的encodin/json包对 JSON数据进行序列化和反序列化
- 序列化
func Marshal(v interface{}) ([]byte, error)
- 反序列化
func Unmarshal(data []byte, v interface{}) error
*/

func main() {
	var (
		data  = `1`
		value int
	)
	err1 := json.Unmarshal([]byte(data), &value)

	fmt.Println("Unmarshal error is:", err1)
	fmt.Printf("Unmarshal value is: %T, %d \n", value, value)

	value2, err2 := json.Marshal(value)

	fmt.Println("Marshal error is:", err2)
	fmt.Printf("Marshal value is: %s \n", string(value2))
}

示例2

package main

import (
	"encoding/json"
	"fmt"
)

// 使用两个结构体演示自定义数据类型的JSON数据编码和解码
// 结构体中
type Response1 struct {
	Page   int
	Fruits []string
}
type Response2 struct {
	Page    int      `json:"Page"`
	Fruites []string `json:"fruite"`
}

func main() {
	//基础数据类型编码为JSON
	bolB, _ := json.Marshal(true)
	fmt.Println(string(bolB))

	intB, _ := json.Marshal(1)
	fmt.Println(string(intB))

	fltB, _ := json.Marshal(2.34)
	fmt.Println(string(fltB))

	strB, _ := json.Marshal("gopher")
	fmt.Println(string(strB))

	//将切片和字典编码为json数组或者对象
	slcD := []string{"apple", "peach", "peer"}
	slcB, _ := json.Marshal(slcD)
	fmt.Println(string(slcB))

	mapD := map[string]int{"apple": 5, "lettuce": 7}
	mapB, _ := json.Marshal(mapD)
	fmt.Println(string(mapB))

	//JSON包可以自编码自定义数据类型
	//类型中可导出成员的值并且默认的情况下,这些成员名称都作为JSON的键
	res1D := &Response1{
		Page:   1,
		Fruits: []string{"apple", "peach", "pear"}}
	res1B, _ := json.Marshal(res1D)
	fmt.Println(string(res1B))

	//可以使用tag来定义编码后的JSON键的名称
	res2D := &Response2{
		Page:    1,
		Fruites: []string{"apple", "peach", "pear"}}
	res2B, _ := json.Marshal(res2D)
	fmt.Println(string(res2B))

	//解码 JSON数据为go数值
	byt := []byte(`{"num":6.13,"strs":["a","b"]}`)

	//需要提供一个变量来存储解码后的json数据
	//`map[String]interface{}`将以kye-Value的方式
	//保存解码后的数据,Value可以为任意数据类型
	var dat map[string]interface{}

	//解码过程,并价检测相关的可能存在的错误
	if err := json.Unmarshal(byt, &dat); err != nil {
		panic(dat)
	}
	fmt.Println(dat)

	//为了使用解码后的map的数据,需要将value转为他们合适的类型
	num := dat["num"].(float64)
	fmt.Println(num)
	//访问嵌套的数据需要一些类型转换
	strs := dat["strs"].([]interface{})
	str1 := strs[0].(string)
	fmt.Println(str1)
}

XML

  • 是可扩展标记语言,包含声明、根标签、子元素和属性
  • 应用场景:配置文件以及webService
    <?xml version="1.0" encoding="UTF-8" ?>
    <servers version="1">
        <server>
            <serverName>Shanghai_VPN</serverName>
            <serverIP>127.0.0.1</serverIP>
        </server>
        <server>
            <serverName>Beijing_VPN</serverName>
            <serverIP>127.0.0.2</serverIP>
        </server>
    </servers>

解析xml

package main

import (
	"encoding/xml"
	"fmt"
	"io/ioutil"
)

// 抽取单个server对象
type Server struct {
	ServerName string `xml:"serverName"`
	ServerIP   string `xml:"serverIP"`
}

type Servers struct {
	Name    xml.Name `xml:"servers"`
	Version int      `xml:"version"`
	Servers []Server `xml:"server"`
}

func main() {
	data, err := ioutil.ReadFile("demo.xml")
	if err != nil {
		fmt.Println(err)
		return
	}
	var servers Servers
	err = xml.Unmarshal(data, &servers)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("xml: %#v\n", servers)
}

标签:xml,string,err,fmt,Println,json,go,Marshal
From: https://blog.51cto.com/u_11555417/6150871

相关文章

  • MongoDB进阶系统学习3——MongoDB高级操作
    第三部分:MongoDB高级操作5聚合分组统计(管道)5.1聚合aggregate聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道......
  • Python实例讲解 -- 解析xml
    doc.xml <?xmlversion="1.0"encoding="utf-8"?><info><intro>信息</intro><listid='001'><head>auto_userone</head><name>Jordy</name>......
  • Go 语言 new 和 make 关键字的区别
    原文链接:Go语言new和make关键字的区别本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的。那就是new和make这两个内置函数......
  • [Algorithm] Disk height (DP + back tracking)
    You'regivenanon-emptyarrayofarrayswhereeachsubarrayholdsthreeintegersandrepresentsadisk.Theseintegersdenoteeachdisk'swidth,depth,......
  • gomock优化diff展示
    使用gomock时可以调用EXPECT()为你的mock对象设置各种期望和返回值,用于验证期望值和运行时的值是否一致。通常情况下可以通过gomock来清晰的看出期望值和真实值的区别,但是......
  • Http Xml Servlet
    Servlet概述访问网站时,我们都是基于WebBrowser/Server这种模式,简称BS框架。Servlet是JavaServlet的简称,称为小服务程序或服务连接器,用java编写的服务器端程序,具......
  • 基于Agora SDK实现Android端的声动互娱(四)——美声、变声和人声
    近几年诈骗罪成为了我国刑事犯罪的第一大罪名,在网络上勾引你裸聊的“小姐姐”很可能是抠脚大汉利用美声软件假扮的。美声和人声在社交娱乐场景中可以为增添场景的趣味性并提......
  • bnuoj 12976 Collecting Gold 状压dp
    http://www.bnuoj.com/problem_show.php?pid=12976状态转移方程:dp[s|1<<j][j]=min(dp[s|1<<j][j],dp[s][i]+dis(i,j));code:#include<iostream>#include<stdio.h>#in......
  • Angular 应用里 ng-package.json 文件的作用是什么?
    如下图所示:{"$schema":"../../node_modules/ng-packagr/ng-package.schema.json","dest":"../../dist/core","lib":{"entryFile":"./public_api.ts"......
  • npm package.json exports filed All In One
    npmpackage.jsonexportsfiledAllInOnehttps://docs.npmjs.com/files/package.jsonhttps://docs.npmjs.com/cli/v9/configuring-npm/package-json/#mainhttps://do......