Golang:转换为JSON.GZ并写入文件

Joe*_*vin 5 json gzip go

尝试使用我的数据完成以下输出:

  1. 转换为JSON字符串并写入file:output.json(此部分正常工作)
  2. Gzip压缩JSON字符串并将其写入json.gz文件:output.json.gz(NOT WORKING)

代码运行正常并写入两个文件.但是当我尝试解压缩时,gzip压缩文件会出现此错误:Data error in 'output.json'. File is broken

这是代码:

package main

import (
    "bytes"
    "compress/gzip"
    "encoding/json"
    "fmt"
    "io/ioutil"
)

type Generic struct {
    Name string
    Cool bool
    Rank int
}

func main() {
    generic := Generic{"Golang", true, 100}
    fileJson, _ := json.Marshal(generic)
    err := ioutil.WriteFile("output.json", fileJson, 0644)
    if err != nil {
        fmt.Printf("WriteFileJson ERROR: %+v", err)
    }

    var fileGZ bytes.Buffer
    zipper := gzip.NewWriter(&fileGZ)
    defer zipper.Close()
    _, err = zipper.Write([]byte(string(fileJson)))
    if err != nil {
        fmt.Printf("zipper.Write ERROR: %+v", err)
    }
    err = ioutil.WriteFile("output.json.gz", []byte(fileGZ.String()), 0644)
    if err != nil {
        fmt.Printf("WriteFileGZ ERROR: %+v", err)
    }
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

fab*_*ioM 8

完成写作后,您需要立即调用zipper.Close()

http://play.golang.org/p/xNeMg3aXxO

_, err = zipper.Write(fileJson)
if err != nil {
    log.Fatalf("zipper.Write ERROR: %+v", err)
}
err := zipper.Close() // call it explicitly and check error 
Run Code Online (Sandbox Code Playgroud)

调用defer zipper.Close()将在主函数结束时触发调用.直到你调用.Close()数据被写入中间缓冲区而不是刷新到实际文件.

  • 使用`err = zipper.Close()`显式调用它并检查`err`. (2认同)