Ruby中JSON单个字段Gzip压缩的编码问题求助
解决方案:将压缩后的二进制数据转Base64编码即可实现需求
当然可以实现该需求,核心问题是Gzip压缩结果是二进制数据(ASCII-8BIT编码),而JSON仅支持UTF-8编码的文本,直接转换会因非法Unicode字节报错。解决思路是把二进制压缩数据转成Base64编码的字符串,这样就能安全序列化为JSON。
具体实现步骤:
- 压缩并编码:将Gzip压缩后的二进制数据用Base64编码为合法字符串
# 压缩字符串并转Base64 compressed_base64 = Base64.strict_encode64(ActiveSupport::Gzip.compress('asdf')) # 存入哈希并转JSON json_result = { compressed: compressed_base64 }.to_json # 此时不会再出现JSON编码错误
- 解析并还原:从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
相关产品推荐
相关产品推荐

