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

Rails中将类JSON哈希字符串转换为JSON对象报错如何解决

问题根因

你拿到的字符串并非标准JSON格式,是Ruby Hash对象直接调用to_s生成的字符串,特征是键值对用=>(哈希火箭符)分隔,不符合JSON要求的「键值用:分隔、字符串类型用双引号包裹」的规范,所以JSON解析器会报错。你之前尝试替换引号没有效果,是因为报错核心原因是分隔符不符合规范,和引号格式无关。

解决方法

临时修复方案(适配现有字符串)

把字符串内所有的=>替换为JSON要求的:,即可正常解析:

str = '{"id"=>"F02DD5GH77X", "created"=>1630584313, "timestamp"=>1630584313}'
formatted_str = str.gsub("=>", ":")
result = JSON.parse(formatted_str)
# 输出结果:{"id"=>"F02DD5GH77X", "created"=>1630584313, "timestamp"=>1630584313}

最优方案(从源头规避问题)

你现在的问题本质是Rails控制器给worker传参时的序列化逻辑问题,常见worker适配器(如Sidekiq)会自动序列化参数,如果直接传未处理的Hash,部分场景下会被转成Hash字符串格式,建议按以下两种方式处理:

  1. 控制器传参前手动序列化为标准JSON
# 控制器侧代码
data = { id: "F02DD5GH77X", created: 1630584313, timestamp: 1630584313 }
SampleWorker.perform_async(data.to_json)
# Worker侧直接解析即可
def perform(str)
  data = JSON.parse(str)
end
  1. 直接传递Hash(更省事,主流worker适配器都原生支持Hash参数序列化,不需要额外转格式)
# 控制器侧直接传Hash
data = { id: "F02DD5GH77X", created: 1630584313, timestamp: 1630584313 }
SampleWorker.perform_async(data)
# Worker侧直接拿到Hash对象,无需额外解析
def perform(data)
  puts data["id"] # 可直接读取属性
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:42:01