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字符串格式,建议按以下两种方式处理:
- 控制器传参前手动序列化为标准JSON
# 控制器侧代码 data = { id: "F02DD5GH77X", created: 1630584313, timestamp: 1630584313 } SampleWorker.perform_async(data.to_json)
# Worker侧直接解析即可 def perform(str) data = JSON.parse(str) end
- 直接传递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
相关产品推荐
相关产品推荐

