gpt4 book ai didi

json - 编码为 JSON 的对象的大小(以位为单位)?

转载 作者:数据小太阳 更新时间:2023-10-29 03:35:36 25 4
gpt4 key购买 nike

我有一个对象。我使用 json.Encoder 将对象编码为 json。

如何测量 json 字符串的大小?

最佳答案

io.Writerjson.Encoder 不公开也不维护写入的字节数。

一种方法是首先使用 json.Marshal() 将值编码到 []byte 中,我们可以使用内置的 len() 函数获取其长度。您寻求的位数是长度乘以 8(1 字节为 8 位)。之后,您必须手动将字节 slice 写入输出。对于小型类型,这不是问题,但对于大型结构/值可能不合需要。此外,还需要进行不必要的编码工作、获取其长度并手动编写 slice 。

更好和更优雅的方法是使用 embedding 扩展任何编写器的功能以管理写入的字节:

type CounterWr struct {
io.Writer
Count int
}

func (cw *CounterWr) Write(p []byte) (n int, err error) {
n, err = cw.Writer.Write(p)
cw.Count += n
return
}

CounterWr 类型自动管理其 Count 字段中写入的字节数,您可以随时检查/检查。

现在你通过你当前使用的io.Writer创建我们的CounterWr值,然后将这个CounterWr值传递给json.NewEncoder() ,您可以直接从 CounterWr.Count 访问写入的字节数。

示例用法:

type Something struct {
S string
I int
}


buf := &bytes.Buffer{}

// Any writer, not just a buffer!
var out io.Writer = buf
cw := &CounterWr{Writer: out}

s := Something{"hello", 4}
if err := json.NewEncoder(cw).Encode(s); err != nil {
panic(err)
}

fmt.Printf("Count: %d bytes, %d bits\n", cw.Count, cw.Count*8)
fmt.Printf("Verif: %d bytes, %d bits\n", buf.Len(), buf.Len()*8)

出于验证目的,我们还打印了用作输出的 bytes.Buffer 的长度(CounterWr.CountBuffer.Len() 应该匹配)。

输出:

Count: 20 bytes, 160 bits
Verif: 20 bytes, 160 bits

Go Playground 上试试。

注意事项:

如果您也对其他值进行编码,cw.Count 当然会是总字节数(而不仅仅是最后一个值的字节数)。如果你只想得到最后一个编码值的大小,在调用Encoder.Encode()之前存储cw.Count,然后计算你得到的计数的差值对其进行编码。或者在编码之前简单地将 cw.Count 设置为 0(是的,您也可以更改该字段):

cw.Count = 0

关于json - 编码为 JSON 的对象的大小(以位为单位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37701584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com