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

Trying to accomplish the following output with my data:

  1. Convert to JSON string and write to file: output.json (this part is working)
  2. Gzip Compress the JSON string and write that to a json.gz file: output.json.gz (NOT WORKING)

The code runs fine and writes to both files. But the gzipped file gives this error when I try to unzip it: Data error in 'output.json'. File is broken

Here's the code:

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)
    }
}

What did I miss?

2个回答



您需要在写完后立即调用zipper.Close()</ p>

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

 < 代码> _,err = zipper.Write(fileJson)
if err!= nil {
log.Fatalf(“ zipper.Write ERROR:%+ v”,err)
}
err:= zipper.Close() //显式调用并检查错误
</ code> </ pre>

调用 defer zipper.Close()</ code>将在主函数结尾触发调用 。 在调用 .Close()</ code>之前,数据将被写入中间缓冲区,而不会刷新到实际文件中。 </ p>
</ div>

展开原文

原文

You need to call zipper.Close() immediately after finishing writing

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 

Calling defer zipper.Close() would trigger the call at the end of the main function. Until you call .Close() the data is being written to an intermediate buffer and not flushed to the actual file.

duanhuan3705
duanhuan3705 +1 @petSO所以你是对的
大约 6 年之前 回复
duanpen9294
duanpen9294 使用err = zipper.Close()显式调用它并检查err。
大约 6 年之前 回复
douhan9619
douhan9619 哦,老兄,被“延期”烧死了。 很好,谢谢!
大约 6 年之前 回复

这个生成的json文件不能追加啊,只是在第一条记录上一直更新,怎么解决啊

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问