当前位置: 首页 > article >正文

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}


http://www.kler.cn/a/442419.html

相关文章:

  • Lianwei 安全周报|2025.1.13
  • 设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo
  • 基于YOLOv8与CGNet的鸟类智能识别系统 深度学习图像分类 鸟类目标检测与分类 图像特征提取 模型优化与应用 数据可视化(源码+指导+定制)
  • 【2024年华为OD机试】 (C卷,100分)- 用连续自然数之和来表达整数(Java JS PythonC/C++)
  • Kylin Linux V10 替换安装源,并在服务器上启用 EPEL 仓库
  • LabVIEW光流算法的应用
  • 使用LSTM神经网络对股票日线行情进行回归训练(Pytorch版)
  • SpringBoot3-整合WebSocket指南
  • milvus 支持向量化索引的方法
  • 【Linux学习】十五、Linux/CentOS 7 用户和组管理
  • P8772 [蓝桥杯 2022 省 A] 求和
  • “包” 管理工具
  • 自动化立体仓库堆垛机SRM控制系统运行控制功能块开发设计
  • VS Code使用NPM脚本启动Vue程序
  • Javascript面试手撕常见题目(回顾一)
  • 计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask
  • The option ‘android.enableAapt2‘ is deprecated and should not be used anymore.
  • Day26下 - 大语言模型的 训练train 和 微调fine-tune 的区别
  • 第十五章 Linux Shell 编程
  • Redis Set操作
  • Django+React---从0搭建一个听音乐+聊天室的网站
  • Linux系统安装node.js
  • 数据版本管理和迁移工具Flyway用法最简说明
  • 什么是Modbus协议网关?
  • 康冠科技嵌入式面试题及参考答案
  • Flux Tools 结构简析