go数据格式-JSON、XML、MSGPack

news2024/10/6 12:25:21

1. JSON

  • json是完全独立于语言的文本格式,是k-v的形式 name:zs
  • 应用场景:前后端交互,系统间数据交互

  • json使用go语言内置的encoding/json 标准库
  • 编码json使用json.Marshal()函数可以对一组数据进行JSON格式的编码
    func Marshal(v interface{}) ([]byte, error)

示例过结构体生成json

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name  string
    Hobby string
}

func main() {
    p := Person{"5lmh.com", "女"}
    // 编码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))
}
struct tag
    type Person struct {
        //"-"是忽略的意思
        Name  string `json:"-"`
        Hobby string `json:"hobby" `
    }

示例通过map生成json

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    student := make(map[string]interface{})
    student["name"] = "5lmh.com"
    student["age"] = 18
    student["sex"] = "man"
    b, err := json.Marshal(student)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(b)
}
  • 解码json使用json.Unmarshal()函数可以对一组数据进行JSON格式的解码
    func Unmarshal(data []byte, v interface{}) error

示例解析到结构体

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Age       int    `json:"age,string"`
    Name      string `json:"name"`
    Niubility bool   `json:"niubility"`
}

func main() {
    // 假数据
    b := []byte(`{"age":"18","name":"5lmh.com","marry":false}`)
    var p Person
    err := json.Unmarshal(b, &p)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(p)
}

示例解析到interface

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    // 假数据
    // int和float64都当float64
    b := []byte(`{"age":1.3,"name":"5lmh.com","marry":false}`)

    // 声明接口
    var i interface{}
    err := json.Unmarshal(b, &i)
    if err != nil {
        fmt.Println(err)
    }
    // 自动转到map
    fmt.Println(i)
    // 可以判断类型
    m := i.(map[string]interface{})
    for k, v := range m {
        switch vv := v.(type) {
        case float64:
            fmt.Println(k, "是float64类型", vv)
        case string:
            fmt.Println(k, "是string类型", vv)
        default:
            fmt.Println("其他")
        }
    }
}

2. 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>
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("D:/my.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)
}

3. MSGPack

  • MSGPack是二进制的json,性能更快,更省空间
  • 需要安装第三方包:go get -u github.com/vmihailenco/msgpack
package main

import (
   "fmt"
   "github.com/vmihailenco/msgpack"
   "io/ioutil"
   "math/rand"
)

type Person struct {
   Name string
   Age  int
   Sex  string
}

// 二进制写出
func writerJson(filename string) (err error) {
   var persons []*Person
   // 假数据
   for i := 0; i < 10; i++ {
      p := &Person{
         Name: fmt.Sprintf("name%d", i),
         Age:  rand.Intn(100),
         Sex:  "male",
      }
      persons = append(persons, p)
   }
   // 二进制json序列化
   data, err := msgpack.Marshal(persons)
   if err != nil {
      fmt.Println(err)
      return
   }
   err = ioutil.WriteFile(filename, data, 0666)
   if err != nil {
      fmt.Println(err)
      return
   }
   return
}

// 二进制读取
func readJson(filename string) (err error) {
   var persons []*Person
   // 读文件
   data, err := ioutil.ReadFile(filename)
   if err != nil {
      fmt.Println(err)
      return
   }
   // 反序列化
   err = msgpack.Unmarshal(data, &persons)
   if err != nil {
      fmt.Println(err)
      return
   }
   for _, v := range persons {
      fmt.Printf("%#v\n", v)
   }
   return
}

func main() {
   //err := writerJson("D:/person.dat")
   //if err != nil {
   // fmt.Println(err)
   // return
   //}
   err := readJson("D:/person.dat")
   if err != nil {
      fmt.Println(err)
      return
   }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1428269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot与springcloud之间的版本对应关系

https://start.spring.io/actuator/info 当然&#xff0c;你可以直接在&#xff1a; https://spring.io/projects/spring-cloud 上看文档查询&#xff0c; 不过&#xff0c;最后应该是调到这里的&#xff1a; https://github.com/spring-cloud/spring-cloud-release/wiki/Suppo…

YoloV8改进策略:Block改进|DCNv4最新实践|高效涨点|完整论文翻译

摘要 涨点效果:在我自己的数据集上,mAP50 由0.986涨到了0.991,mAP50-95由0.737涨到0.753,涨点明显! DCNv4是可变形卷积的第四版,速度和v3相比有了大幅度的提升,但是环境搭建有一定的难度,对新手不太友好。如果在使用过程遇到编译的问题,请严格按照我写的环境配置。…

代码随想录算法训练营DAY10 | 栈与队列 (1)

理论基础及Java实现参考文章&#xff1a;栈和队列 一、LeetCode 232 用栈实现队列 题目链接&#xff1a;232.用栈实现队列https://leetcode.cn/problems/implement-queue-using-stacks/ 思路&#xff1a;使用两个栈stack1、stack2实现队列&#xff1b;stack1用来存储入队元素&…

幻兽帕鲁社区服务器搭建架设开服教程(LINUX)

幻兽帕鲁社区服务器搭建架设开服教程&#xff08;LINUX&#xff09; 大家好我是艾西&#xff0c;上一期我给大家分享了windows系统版本的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对于服务器的配置有一定的要求很多小伙伴就思考用linux系统搭建的话占用会不会小一点&#x…

从零搭建Vue3 + Typescript + Pinia + Vite + Tailwind CSS + Element Plus开发脚手架

项目代码以上传至码云&#xff0c;项目地址&#xff1a;https://gitee.com/breezefaith/vue-ts-scaffold 文章目录 前言脚手架技术栈简介vue3TypeScriptPiniaTailwind CSSElement Plusvite 详细步骤Node.js安装创建以 typescript 开发的vue3工程集成Pinia安装pinia修改main.ts创…

二叉搜索树,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 代码补充说明&#xff1a; 代码实现(中序遍历)&#xff1a; 题目地址&#xff1a; 98. 验证二叉搜索树 - 力扣&#xff08;LeetCod…

CSS 星空按钮

<template><button class="btn" type="button"><strong>星空按钮</strong><div id="container-stars"><div id="stars"></div></div><div id="glow"><div class=…

怎么控制Element的数据树形表格展开所有行;递归操作,打造万能数据表格折叠。

HTML <el-button type"success" size"small" click"expandStatusFun"> <span v-show"expandStatusfalse"><i class"el-icon-folder-opened"></i>展开全部</span><span v-show"expan…

解决nvm切换node版本后原先npm全局安装(npm i -g)的包无法使用

找到node14版本下的node_global文件夹&#xff0c;复制文件夹路径&#xff0c;然后点击环境变量、系统编辑&#xff0c;点击path、点击编辑 在终端输入npm config set prefix “E:\devSoft\git\nvm\v14.18.3\node_global”&#xff0c;其中E:\devSoft\git\nvm\v14.18.3\node_g…

【软件工程】建模工具之开发各阶段绘图——UML2.0常用图实践技巧(功能用例图、静态类图、动态序列图状态图活动图)

更多示例图片可以参考&#xff1a;&#xff08;除了常见的流程图&#xff0c;其他都有&#xff09; 概念&#xff1a;类图 静态&#xff1a;用例图 动态&#xff1a;顺序图&状态图&活动图 1、【面向对象】UML类图、用例图、顺序图、活动图、状态图、通信图、构件图、部…

2024年美赛 (D题ICM)| 湖流网络水位控制 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看美赛的D题&#xff01; 完整内容可以在文章末尾领…

网络原理-TCP/IP(4)

TCP原理 滑动窗口 之前我们讲过了确认应答策略,对发送的每一个数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段. 确认应答,超时重传,连接管理这样的特性都是为了保证可靠运输,但就是付出了传输效率(单位时间能传输数据的多少)的代价,因为确认应答机制导致了时间大…

hivesql的基础知识点

目录 一、各数据类型的基础知识点 1.1 数值类型 整数 小数 float double(常用) decimal(针对高精度) 1.2 日期类型 date datetime timestamp time year 1.3 字符串类型 char varchar / varchar2 blob /text tinyblob / tinytext mediumblob / mediumtext lon…

字符串的简单处理

第1题 ISBN号码 查看测评数据信息 每一本正式出版的图书都有一个ISBN号码与之对应&#xff0c;ISBN码包括9位数字、1位识别码和3位分隔符&#xff0c;其规定格式如“x-xxx-xxxxx-x”&#xff0c;其中符号“-”就是分隔符&#xff08;键盘上的减号&#xff09;&#xff0c;最…

图像超分辨率方法与在线工具

图像超分辨率(Super Resolution, SR)是一种增强图像分辨率的技术&#xff0c;目的是从低分辨率(Low Resolution, LR)图像重建出高分辨率(High Resolution, HR)图像。这项技术在视频增强、卫星图像处理、医学成像等领域有广泛应用。图像超分辨率方法可以分为三大类&#xff1a;插…

Python算法题集_矩阵置零

Python算法题集_矩阵置零 题73&#xff1a;矩阵置零1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【三层循环】2) 改进版一【纵横计数器】3) 改进版二【原地算法】 4. 最优算法 本文为Python算法题集之一的代码示例 题73&#xff1a;矩阵置零…

linux ln命令-linux软链接、硬链接-linux软、硬链接的区别(二):软链接

0、序 上一篇&#xff1a;linux ln命令-linux软链接、硬链接-linux软、硬链接的区别(一)&#xff1a;硬链接 描述了硬链接相关内容&#xff0c;本篇主要描述软链接。 1、软链接 符号链接也称软链接&#xff0c;是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。…

【JS】Express.js环境配置与示例

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Express.js环境配置与示例。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不…

【云手机】快速获取一台属于你的云手机,在云上调试你的应用!

0x00 前言 随着科技的飞速发展&#xff0c;云手机已然成为一种云端虚拟商品&#xff0c;它打破地域限制&#xff0c;让你随时随地畅享移动体验。红手指、小鱼云手机等平台虽便捷易用&#xff0c;却在可扩展性和隐私性方面有所欠缺。冗长的《隐私政策》是否让你望而却步&#x…

C++通用编程(2)

函数模板高级用法 1.分文件编写的优点2.普通函数的分文件编写3.函数模板的分文件编写4.细节提示5.函数模板应用高级decltype推导类型函数后置返回类型 6.总结 函数模板讲完后&#xff0c;C全部的函数类型我们就接触的差不多了。今天给做一些关于函数份文件编写的知识点补充。 1…