【问题标题】:Golang: Convert to JSON.GZ and write to fileGolang:转换为 JSON.GZ 并写入文件
【发布时间】:2014-08-18 21:44:37
【问题描述】:

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

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

代码运行良好并写入两个文件。但是当我尝试解压缩时,gzipped 文件会出现此错误: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)
    }
}

我错过了什么?

【问题讨论】:

    标签: json go gzip


    【解决方案1】:

    写完后需要立即调用 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() 之前,数据将被写入中间缓冲区,而不是刷新到实际文件中。

    【讨论】:

    • err = zipper.Close()明确调用它并检查err
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多