Ruby获取数组的字节大小

11
我想要获取Ruby中数组(items)内容的字节数大小。我是这样填充数组的:
  @records.each do |record|
    items << { :table => table, :id => record.id, :lruos => record.updated_at }
  end

实际上,我想在将其序列化为 JSON 时强制发送此数组的 Content-Length:

respond_to do |format|
  #response['Content-Length'] = items.to_s.size
  format.json { render :json => { :success => "OK", :items => items } }
end

有任何想法去做这件事情都可能是有趣的。 (由于我不知道内容长度,所以想强制发送它)

我使用的是Rails 3.0.5。


1
为什么不先将其序列化,然后获取序列化字符串的大小呢?序列化后的 JSON 可能比数组更大,因此您的方法行不通。 - user142019
3个回答

10

就像WTP所说的那样,您可能打算返回JSON表示而不是数组的ruby表示的大小,因为JSON是浏览器的实际响应。您可以通过先进行编码(生成字符串),然后检查其大小来实现这一点。

response['Content-Length'] = ActiveSupport::JSON.encode(items).size

更多关于JSON序列化和Rails的内容


我理解你所说的内容以及序列化的方式,但是在添加你的代码后,我遇到了这个错误:读取错误:#<NoMethodError: private method `split' called for 241700:Fixnum>。 - alex.bour
问题在于“size”。我尝试使用“length”但是出现了相同的错误。 - alex.bour
嗯,我不确定为什么会发生这种情况。你能在Rails控制台中构建一个记录哈希并对其进行序列化吗?ActivSupport :: JSON应该能够序列化几乎任何东西--它处理所有Rails对象和基元,并且还应该在没有to_json的对象上调用to_s。您可以尝试对哈希的单个字段进行序列化(即对记录的更新时间进行编码,对表进行编码,对记录ID进行编码等),直到找到错误--然后您就知道哪些内容不受支持了。 - Sherwin Yu
事实是ActiveSupport:JSON正常工作。我得到的响应如下:[{"id":"1","table":"countries","lruos":"2000-01-01T00:00:00Z"},{"id":"10","table":"countries","lruos":"2000-01-01T00:00:00Z"},{"id":"100","table":"countries","lruos":"2000-01-01T00:00:00Z"}],使用response['Content-Length'] = ActiveSupport::JSON.encode(items)只询问大小是一个问题,并返回上述错误(读取错误:#<NoMethodError: private method `split' called for 241700:Fixnum>)。 - alex.bour

5

或者,你也可以通过item.to_json.bytesize来实现。这将给出被发送的JSON字符串的大小。


1

对于那些仍然疑惑的人 - 我发现这个方法有效

ActiveSupport::JSON.encode(items).size.to_s

虽然已经过去了很多年,但这可能会对某些人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接