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

时间:2014-08-18 21:44:38

标签: json go gzip

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

  1. 转换为JSON字符串并写入file:output.json(此部分正常工作)
  2. Gzip压缩JSON字符串并将其写入json.gz文件:output.json.gz( NOT WORKING
  3. 代码运行正常并写入两个文件。但是当我尝试解压缩时,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)
        }
    }
    

    我错过了什么?

1 个答案:

答案 0 :(得分: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 

调用defer zipper.Close()会在主函数结束时触发调用。在调用.Close()之前,数据正被写入中间缓冲区而不会刷新到实际文件。