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}
qq:505645074