如何截断哈希中的数据以使生成的 JSON 不长于 n 个字节?

2024-01-11

我有一个看起来像这样的哈希:

{ :a => "some string", :b => "another string", :c => "yet another string" }

我不想打电话to_json最终,但生成的 json 字符串不能长于n bytes.

如果字符串太大,那么首先:c应首先被截断。如果这还不够,:b应该被截断。最后:a。字符串还可以包含多字节字符,例如德语变音符号,Ruby 版本为 1.8.7。 (变音符号首先占用 2 个字节,但作为 json,它们的长度为 5 个字节。)

我写的是一个循环,将哈希值转换为 _json 并检查长度。如果小于或等于n它被返回,否则我连接的值:a + :b + :c并缩短一半。如果新的哈希太大(小),我会缩短(扩展)原始字符串的 1/4、1/8、1/16。最后我得到了长度hash.as_json == n.

这一切都感觉非常hackish,尽管所有测试都经过检查,但我不确定这是否稳定。

有人对如何正确解决这个问题有好的建议吗?


怎么样:

# encoding:UTF-8

require 'rubygems'
require 'json'

def constrained_json(limit, a, b, c)
  output, size, hash  = nil, 0, { :a => a, :b => b, :c => c}
  [:c, :b, :a, :a].each do |key|
    output = hash.to_json
    size = output.bytesize
    break if size <= limit
    # on 1.9:
    # hash[key] = hash[key][0...(limit - size)]
    # on 1.8.7
    hash[key] = hash[key].unpack("U*")[0...(limit - size)].pack("U*")
  end
  raise "Size exceeds limit even after truncation" if size > limit
  output
end

38.downto(21) do |length|
  puts "# #{constrained_json(length, "Qué te", "parece", "eh?")}"
end

# {"a":"Qué te","b":"parece","c":"eh?"}
# {"a":"Qué te","b":"parece","c":"eh"}
# {"a":"Qué te","b":"parece","c":"e"}
# {"a":"Qué te","b":"parece","c":""}
# {"a":"Qué te","b":"parec","c":""}
# {"a":"Qué te","b":"pare","c":""}
# ...
# {"a":"","b":"","c":""}
# test.rb:14:in `constrained_json': Size exceeds limit even after truncation (RuntimeError)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何截断哈希中的数据以使生成的 JSON 不长于 n 个字节? 的相关文章

  • Ruby 中的任务/未来

    代表潜在延迟的异步计算并且可以订阅其完成的模式的惯用 Ruby 模拟是什么 即类似于 NET 的东西System Threading Task 或Python 3 xconcurrent futures future 请注意 这并不一定意味
  • 哈希表的空间复杂度是多少?

    具有 32 位键和指向单独存储的值的 32 位指针的哈希表的大小是多少 是 2 32 个槽 4 字节 键 4 字节 指向值的指针 4 10 9 4 4 32GB 我想了解哈希表的空间复杂度 我认为你问错了问题 数据结构的空间复杂度表示它占用
  • 多重要求和允许强参数rails 4

    在下面的情况下 我尝试使用强参数 我想要求email address password并允许remember me fields 但像下面这样使用它只允许最后一行在方法示例中 在下面的情况下 它只需要params permit rememb
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • 如何从 ruby​​ 中的字符串中删除所有非数字?

    用户输入数字的形式如下 1 800 432 4567 800 432 4567 800 432 4566 800 432 4567 1 800 432 4567 800 432 4567 我希望所有这些都变成没有特殊字符的剥离版本 例如18
  • Rails:named_scope、lambda 和块

    我认为以下两个是等效的 named scope admin lambda company id conditions gt company id company id named scope admin lambda do company
  • 迭代任意大小的子集

    我可以迭代大小为 1 的子集 for int a 0 a lt size a 或大小为 2 的子集 for int a1 0 a1 lt size a1 for int a2 a1 1 a2 lt size a2 or 3 for int
  • Bundle 说 gem 丢失了 - 但事实并非如此?

    背景 我正在维护contentRuby On Rails 站点 但我确实没有 Rails 的经验 当尝试运行 Rails 服务器时 rails s我明白了 在任何来源中均找不到 activesupport 3 2 0 Run bundle
  • 给定一个具有多个重复条目的数组,找到一个重复条目 O(N) 时间和常数空间

    我们得到了一个大小为 N 的数组 其中包含 0 到 N 2 范围内的整数 包括 0 和 N 2 该数组可以有多个重复的条目 我们需要在 O N 时间和常量空间中找到重复条目之一 我正在考虑取数组中所有条目的乘积和总和 以及 0 到 N 2
  • 如何从迭代器推导连续内存

    不知何故 本土stl copy VC Dinkumware 上的算法表明它可以使用memcpy 可以轻松复制的数据 一个凡人能做到这一点吗 假设每个元素都是普通可复制的 random access iterator 是否意味着连续内存 标准
  • PHP - hash_pbkdf2 函数

    我正在尝试使用此 php 函数执行一个函数来哈希密码 http be php net manual en function hash pbkdf2 php http be php net manual en function hash pb
  • 实施二分查找有哪些陷阱? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 二分查找比看起来更难实现 虽然二分搜索的基本思想相对简单 但细节可能出人意料地棘手 Donald Knuth 新的二分搜索实现中最有可
  • 用于开始和/或包含搜索的最快字符串集合结构/算法是什么

    我有以下情况 我有一个大的字符串集合 比如说 250 000 平均长度可能是 30 我要做的就是在这些搜索中进行许多搜索 大多数搜索都是 StartsWith 和 Contains 类型的 该集合在运行时是静态的 这意味着选择的集合的初始读
  • 使用rSpec 测试delayed_job 链的最佳方法是什么?

    目前 当我的代码中有一个延迟方法时 如下所示 CommentMailer delay deliver comments comment true 我在规范中写了这样的内容 dj mock DelayProxy CommentMailer s
  • 以 O(1) 计算汉明权重 [重复]

    这个问题在这里已经有答案了 在二进制表示中 汉明权重是 1 的数量 我偶然发现了网络并找到了一个 O 1 的答案 v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 in
  • 获取express.js中间件请求中“#”后的url

    我需要获取服务器中间件上的 url 使用express js 我用req url但是当 url 开头时 some urlreq url 返回 与req path 有没有办法获取url之后 在express js中 No URL 中以 符号永
  • n 或 nlog(n) 比常数时间或对数时间更好吗?

    在 Coursera 上的普林斯顿教程中 讲师解释了遇到的常见增长顺序函数 他说 线性和线性算术运行时间是 我们努力的目标 他的推理是 随着输入大小的增加 运行时间也会增加 我认为这是他犯了错误的地方 因为我之前听过他提到线性增长顺序对于高
  • 超类与类SpecificationPolicy不匹配

    我得到了一个superclass mismatch for class SpecificationPolicy尝试安装或升级某些brew 软件包时出错 例如 更新安装 supabase CLI 时 brew install supabase
  • 在 Sinatra 中运行后台进程

    我有 Sinatra Rails 应用程序和一个启动一些漫长过程的操作 通常我会为后台作业排队 但这种情况太简单了 后台进程很少启动 所以队列是一个开销 那么如何在没有队列的情况下运行后台进程呢 get build logs project

随机推荐

  • 如何更改 Properties.Settings 的默认路径

    每当我这样做时Properties Settings Save 它将属性更改提交给Application LocalUserAppDataPath但我希望路径是Application CommonAppDataPath where Appl
  • 扩展 Git 功能

    我想知道是否有一种简单的方法来扩展 Git 命令 所以我可以创建如下命令 git my custom made extension my options
  • 将变量插入 PHP 标头位置

    问题是 如何插入变量 echo url endpoint 作为最后一行链接的一部分 header Location http linkhere com HERE I WANT THE VARIABLE http linkhere com H
  • 实现简单的输入流

    我想写一个简单的istream对象 这会简单地改变另一个istream 我只想实现readline 它会从原始流中读取一行 处理它 并返回处理后的行 并有一些通用代码read将使用我的读取行 缓存它 并提供所需的字节数作为输出 有没有什么课
  • 如何对具有软删除的表使用子查询?

    我有一个查询和一个子查询 如下所示 query not included here query query gt getQuery subQuery User select gt fromSub query sub query gt whe
  • 用于区分 Google Pixel 1/2、Google Pixel XL 和 Google Pixel 2 XL 的媒体查询

    我正在编写一个科尔多瓦应用程序 需要隔离这些谷歌手机来调整样式 鉴于这种 我很难区分任何一款 Google Pixel 手机 media only screen and min width 411px and max width 731px
  • 未应用 WPF 窗口样式

    我有一个 ResourceDictionary 其中包含应用程序中使用的控件的样式定义 所有样式都正确应用于窗口中的控件 但是窗口本身的 ResourceDictionary 中的样式没有被应用 这是我的 ResourceDictionar
  • 如何给DialogFragment添加动画?

    如何向 DialogFragment 添加动画 我的动画是 输出动画
  • 将 Selenium 与 Chromium 浏览器结合使用

    在 Selenium 选项 在 Firefox 上 中我可以找到Custom browser 是否可以使用此选项来运行 Selenium 测试铬浏览器 不是 Chrome 呃 接受的答案没有回答问题 Google Chrome 基于 Chr
  • 按最近排序 - PostGIS、GeoRuby、spatial_adapter

    我正在尝试执行一个订单查询来查找最接近 current user 的记录 我知道两点之间的距离是 current location euclidean distance record position 如何将其处理到 PostGIS 或 a
  • 在没有 Rails 的情况下使用 ActiveResource

    您好 我正在开发一个 Rails 应用程序 它通过 ActiveResource 公开一些方法 我想通过一个简单的远程 ruby 脚本访问这些资源 我想知道是否可以在没有 Rails 的情况下使用 ActiveResource 确实可以 A
  • 如何保持闪屏直到应用程序委托中的进程结束?

    在应用程序委托中 我放置了一些功能 我希望启动画面等待应用程序委托完成其功能 现在 我的应用程序立即一起运行初始视图控制器函数和应用程序委托函数 func application application UIApplication didF
  • Symfony 4.4 在用户测试中针对多个客户端的弃用警告已弃用,但仍存在于文档中

    受影响的 Symfony 版本 4 4 0 描述升级到 Symfony 4 4 0 后 我收到以下弃用警告 自 Symfony 4 4 起 在内核启动时调用 Symfony Bundle FrameworkBundle Test WebTe
  • 从另一个窗体 vb.net 运行函数

    我在 Form1 中有 Module Main 和一个名为 Main 的函数 Public Module Main Public Sub Main End Sub End Module 我想从 Form2 运行它 执行 Form1 Main
  • 应使用 AssertNull 或 AssertNotNull

    这是一个非常愚蠢的问题 但我第一次进行单元测试 所以 假设我有一个像 obj 这样的对象变量 如果这个 obj 为 Null 我希望我的单元测试失败 那么对于断言 我应该说 AssertNull 还是 AssertNotNull 我很困惑它
  • WebJob“主机未运行”。如何调试?

    Azure 网站 Web 作业处于联机状态 没有部署错误 并且在任何级别的已部署 Web 作业的 WebJob SCM 控制台上都看不到任何错误 除了 主机未运行 和一些模糊信息 见下文 我可以在 VisualStudio 2015 中本地
  • Flask-admin 不显示外键列

    class Parent db Model id db Column db Integer primary key True name db Column db String 120 def repr self return
  • R markdown ioslides 代码块增量模式

    如何让 R 代码块逐渐出现 例如 我在标题中添加了以下选项 other configurations output ioslides presentation incremental true 但增量模式仅适用于项目符号而不适用于代码块 S
  • XCode4 和数据模型编译出现 MOMC 错误

    每当我构建项目时 我都会收到错误 Command Developer usr bin momc failed with exit code 1 我在这里阅读了有关删除无关数据模型版本作为修复的帖子 但没有任何效果 我很困惑 因为没有任何东西
  • 如何截断哈希中的数据以使生成的 JSON 不长于 n 个字节?

    我有一个看起来像这样的哈希 a gt some string b gt another string c gt yet another string 我不想打电话to json最终 但生成的 json 字符串不能长于n bytes 如果字符