当前位置: 首页 > 面试题库 >

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

滑弘扬
2023-03-14
问题内容

我有一个对象。我使用将对象编码为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.Count0编码前(是的,您也可以更改该字段):

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: