golang 使用gzip对json例子

package main

import (

"bytes"

"compress/gzip"

"encoding/json"

"fmt"

"io"

"log"

)

// User 结构体定义

type User struct {

ID int `json:"id"`

Name string `json:"name"`

Age int `json:"age"`

Fee float64 `json:"fee"`

}

// gzipCompress 将任何类型的接口压缩为 Gzip 格式

func gzipCompress(v interface{}) ([]byte, error) {

// 将结构体转换为JSON字节切片

jsonData, err := json.Marshal(v)

if err != nil {

return nil, err

}

var buf bytes.Buffer

// 创建Gzip Writer

w := gzip.NewWriter(&buf)

if _, err := w.Write(jsonData); err != nil {

return nil, err

}

// 关闭Gzip Writer

if err := w.Close(); err != nil {

return nil, err

}

return buf.Bytes(), nil

}

// gzipDecompress 解压缩 Gzip 数据,填充到目标结构体

func gzipDecompress(compressedData []byte, v interface{}) error {

r, err := gzip.NewReader(bytes.NewReader(compressedData))

if err != nil {

return err

}

defer r.Close()

// 读取解压缩后的数据

decompressedData, err := io.ReadAll(r)

if err != nil {

return err

}

// 将JSON数据解码到目标结构体

return json.Unmarshal(decompressedData, v)

}

// 主函数

func main() {

// 创建示例用户数据

user := User{

ID: 1,

Name: "Alice",

Age: 30,

Fee: 1500.00,

}

// 压缩JSON数据

compressedData, err := gzipCompress(user)

if err != nil {

log.Fatal(err)

}

fmt.Printf("Compressed Data (Gzip bytes): %v\n", compressedData)

// 解压缩回原始的用户数据

var decompressedUser User

if err := gzipDecompress(compressedData, &decompressedUser); err != nil {

log.Fatal(err)

}

// 输出解压缩后的数据

fmt.Printf("Decompressed User: %+v\n", decompressedUser)

}

输出:

Compressed Data (Gzip bytes): [31 139 8 0 0 0 0 0 0 255 170 86 202 76 81 178 50 212 81 202 75 204 77 85 178 82 114 204 201 76 78 85 210 81 74 76 79 85 178 50 54 208 81 74 75 77 85 178 50 52 53 48 168 5 4 0 0 255 255 212 252 187 47 43 0 0 0]

Decompressed User: {ID:1 Name:Alice Age:30 Fee:1500}

相关推荐
apocelipes1 小时前
下划线字段在golang结构体中的应用
golang
cui__OaO1 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
鱼鱼说测试2 小时前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
艾莉丝努力练剑2 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
CHEN5_023 小时前
【Java基础面试题】Java基础概念
java·开发语言
杜子不疼.4 小时前
《Python学习之字典(一):基础操作与核心用法》
开发语言·python·学习
落霞的思绪4 小时前
Java设计模式详细解读
java·开发语言·设计模式
阿巴~阿巴~4 小时前
深入解析C++ STL链表(List)模拟实现
开发语言·c++·链表·stl·list
java1234_小锋5 小时前
一周学会Matplotlib3 Python 数据可视化-绘制自相关图
开发语言·python·信息可视化·matplotlib·matplotlib3
甄超锋5 小时前
Java Maven更换国内源
java·开发语言·spring boot·spring·spring cloud·tomcat·maven