You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中JSON单个字段Gzip压缩的编码问题求助

解决方案:将压缩后的二进制数据转Base64编码即可实现需求

当然可以实现该需求,核心问题是Gzip压缩结果是二进制数据(ASCII-8BIT编码),而JSON仅支持UTF-8编码的文本,直接转换会因非法Unicode字节报错。解决思路是把二进制压缩数据转成Base64编码的字符串,这样就能安全序列化为JSON。

具体实现步骤:

  1. 压缩并编码:将Gzip压缩后的二进制数据用Base64编码为合法字符串
# 压缩字符串并转Base64
compressed_base64 = Base64.strict_encode64(ActiveSupport::Gzip.compress('asdf'))
# 存入哈希并转JSON
json_result = { compressed: compressed_base64 }.to_json
# 此时不会再出现JSON编码错误
  1. 解析并还原:从JSON中取出编码后的字符串,解码后解压还原原始内容
# 解析JSON
parsed_hash = JSON.parse(json_result)
# 解码Base64并解压
original_string = ActiveSupport::Gzip.decompress(Base64.strict_decode64(parsed_hash['compressed']))
# original_string 会输出 'asdf'

原理说明:

Base64编码会将任意二进制数据转换为仅包含字母、数字和少量符号的ASCII字符串,这类字符串完全符合JSON对UTF-8文本的要求,完美规避了二进制数据直接转JSON时的编码冲突问题。之前尝试直接将二进制数据转UTF-8失败,是因为压缩后的二进制包含大量非UTF-8兼容的字节,无法直接转换为合法的UTF-8文本。

内容的提问来源于stack exchange,提问作者Mike Snare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:24:53