为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 json gzip 文件解组为结构

如何将 json gzip 文件解组为结构

Go
至尊宝的传说 2023-06-19 16:07:50
我正在编写一个 trie DS,将 json gzip 压缩到一个文件中trieSample.json.gz,然后将其读回结构中。奇怪的是,解组成功但结构未填充。我试过 json.Unmarshal 和 json.Decoder 都无济于事。需要帮助找到我在这里缺少的东西。读取时不会抛出任何错误,只是该结构没有任何键。如果我尝试正常的 json marshal -> 写入文件并从文件读取 -> Unmarshal,它会正常工作。var charSet = "0123456789bcdefghjkmnopqrstuvwxyz"const logTagSlice = "trie.log"type trieSlice struct {    Children []*tNode          `json:"c"`    Charset  map[int32]int8    `json:"l"` // Charset is the legend of what charset is used to create the keys and how to position them in trie array    logger   loggingapi.Logger `json:"-"`    capacity int               `json:"-"` // capacity is the slice capacity to have enough to hold all the characters in the charset}type tNode struct {    Children []*tNode `json:"c"`           // children represents the next valid runes AFTER the current one    IsLeaf   bool     `json:"e,omitempty"` // isLeaf represents if this node represents the end of a valid word    Value    int16    `json:"v,omitempty"` // value holds the corresponding value for key value pair, where key is the whole tree of nodes starting from parent representing a valid word}// NewTrieSlice returns a Trie, charset represents how the children need to be positioned in the arrayfunc NewTrieSlice(charset string, logger loggingapi.Logger) *trieSlice {    m := map[int32]int8{}    for index, r := range charset {        m[r] = int8(index)    }    return &trieSlice{        Charset:  m,        Children: make([]*tNode, len(charset)),        logger:   logger,        capacity: len(charset),    }}func newNode(capacity int) *tNode {    return &tNode{        Children: make([]*tNode, capacity),    }}spew.Dump 显示 trieSlice Children 数组包含所有 nil 元素
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

在使用数据之前关闭压缩机。使用前先解压数据。不要因不当使用 bufio.Scanner 而将其砍掉。


var network bytes.Buffer

b, err := json.Marshal(trie)

if err != nil {

    fmt.Println("error in marshal ... ", err.Error())

    t.Fail()

}

w := gzip.NewWriter(&network)

w.Write(b)

w.Close()

err = ioutil.WriteFile("trieSample.json.gz", network.Bytes(), 0644)

if err != nil {

    log.Fatal(err)

}


trieDecoder := NewTrieSlice(charSet)


// attempt via json Unmarshal

file, err := os.Open("trieSample.json.gz")

if err != nil {

    log.Fatal(err)

}

r, err := gzip.NewReader(file)

if err != nil {

    log.Fatal(err)

}

err = json.NewDecoder(r).Decode(trieDecoder)

if err != nil {

    log.Fatal(err)

}

spew.Dump(trieDecoder)

https://play.golang.org/p/pYup3v8-f4c


查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信