如何在Ruby中解析以符号而非字符串为键的类JSON字符串?
问题原因与解决方案
你提供的字符串并非标准JSON格式,而是Ruby哈希的字面量表示(比如使用=>连接键值、符号类型的键、Ruby原生日期格式),所以直接调用JSON.parse会触发解析错误。
解决方法
方法1:利用Ruby解析哈希后转JSON(来源可信时用)
如果字符串来源安全(比如内部生成),可以用eval将其转为Ruby哈希,再处理:
require 'json' # 你的类JSON字符串 ruby_hash_str = "{:status=>\"ok\", :hitcount=>\"1\", :request_date=>Wed, 10 Oct 2019 00:00:00 +0000}" # 转为Ruby哈希 hash = eval(ruby_hash_str) # 若需要标准JSON字符串,可生成 valid_json = JSON.generate(hash) # 若直接用Ruby对象,直接操作hash即可
⚠️ 注意:eval会执行字符串中的任意Ruby代码,不可用于处理不可信来源的字符串。
方法2:手动转换为标准JSON(安全通用)
通过字符串替换将非标准格式修正为符合JSON规范的格式:
require 'json' ruby_hash_str = "{:status=>\"ok\", :hitcount=>\"1\", :request_date=>Wed, 10 Oct 2019 00:00:00 +0000}" # 1. 将符号键(:key=>)替换为JSON格式的键("key":) formatted = ruby_hash_str.gsub(/:(\w+)=>/, '"\1":') # 2. 将日期部分包裹为字符串(JSON要求所有非数值/布尔值的字面量必须是字符串) formatted = formatted.gsub(/(Wed, \d{2} \w{3} \d{4} \d{2}:\d{2}:\d{2} \+0000)/, '"\1"') # 现在可以正常解析 parsed_data = JSON.parse(formatted)
内容的提问来源于stack exchange,提问作者Mohammad Arif
相关产品推荐
相关产品推荐

