我有一个对象。我使用将对象编码为json json.Encoder
。
我怎样才能测量json字符串的大小?
io.Writer
并且json.Encoder
不公开也不维护写入字节数。
一种方法是先使用内置函数json.Marshal()
将[]byte
其编入其长度来封送该值len()
。您要查找的位数是长度乘以8(1字节为8位)。之后,您必须手动将字节片写入输出中。对于小型类型,这不是问题,但是对于大型结构/值,可能是不希望的。另外,也没有必要的工作将其编组,获取其长度并手动编写切片。
一种更好,更优雅的方法是使用 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
字段中的写入字节数,您可以随时对其进行检查/检查。
现在,您创建一个CounterWr
传递io.Writer
当前使用的的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.Count
并且Buffer.Len()
应该匹配)。
输出:
Count: 20 bytes, 160 bits
Verif: 20 bytes, 160 bits
在Go Playground上尝试一下。
笔记:
如果您也对其他值进行编码,cw.Count
则将是当然的总字节数(而不仅仅是最后一个值)。如果只想获取最后一个编码值的大小,请cw.Count
在调用之前存储Encoder.Encode()
,然后计算与编码后得到的计数之差。或简单地设置cw.Count
为0
编码前(是的,您也可以更改该字段):
cw.Count = 0
问题内容: 我知道您可以用来获取类型的大小。 例如: 但是,对于类实例(对象),返回对对象的引用的大小(在64位计算机上为8字节),而不是堆上实际对象的大小。 如何获得对象本身的大小? 对于那些想知道的人,我并没有真正的需要,我只是在探索Swift及其与C的互操作性。 问题答案: Apple平台 上的一种选择是使用Swift Obj-C运行时函数,因为Swift类当前是在其中建立的Objectiv
问题内容: 希望我不必在这里重新发明轮子,但是有人知道C#中是否有一个类似于Adobe为AS3提供的类,用于将通用对象转换为JSON字符串的类? 例如,当我编码一个对象数组时。 输出: 问题答案: 在C#中:
我在斯卡拉偶然发现了intersting这个东西(可能只对我来说)。总而言之,如果我们有一个BigDecimal(假设,其中是十进制字符串) 不会总是产生< code>true。我认为它与大小数的运算有关。我知道在scala中,创建BigDecimals的默认MathContext设置为< code>DECIMAL128(四舍五入,精度等于34)。我在小数点后超过30位的小数上发现了这种行为 我的
问题内容: 我希望找到如何获取OracleDB中结果集的kb大小。我不是系统管理员,但是经常运行返回超过10万行的查询,因此我需要找到一种确定总kb大小的方法。谢谢你 问题答案: 在SQL * Plus中: 要使用AUTOTRACE,需要PLUSTRACE角色,默认情况下不会授予该角色。了解更多。
问题内容: 给定matplotlib中的一组轴,是否有办法确定其像素大小?我需要根据调整大小来调整大小,以适应更大或更小的数字。 (特别是我想更改线宽,使其与轴的大小成比例。) 问题答案: 这给出了以英寸为单位的宽度和高度。 这可能足以满足您的目的,但是要获得像素,可以乘以: 例如, 要制作与该图形大小完全相同的图像,必须删除图形与轴之间的空格:
问题内容: 是否有将JavaScript对象编码为JSON的好方法? 我有一个键值对列表…其中名称来自复选框,根据是否选中该框,值为true或false: 我想将这些值传递到JSON对象中,然后存储到cookie中以呈现表(将根据用户检查的内容添加列)。 有人知道解决方案吗? 问题答案: 我认为您可以使用JSON.stringify: