如何在Ruby中解析以符号而不是字符串作为键的json字符串数据?

mum43rcc  于 2023-08-04  发布在  Ruby
关注(0)|答案(3)|浏览(89)

下面是JSON字符串示例

json = "{:status=>\"ok\", :hitcount=>\"1\", :request_date=>Wed, 10 Oct 2019 00:00:00 +0000}"

字符串
我已经尝试了下面提到的片段,但这没有工作,并给出错误JSON::ParserError (765: unexpected token at

require 'json'
JSON.parse(json)

vmdwslir

vmdwslir1#

不幸的是,JSON不能表示Ruby符号。JSON还要求键和值都要加引号,所以你提供的不是有效的JSON,会破坏JSON解析器。你只需要:

json = "{\"status\": \"ok\", \"hitcount\": \"1\", \"request_date\": \"Wed, 10 Oct 2019 00:00:00 +0000\"}"

字符串
然后是Ruby JSON parser(感谢@engineersmnky!)有一个漂亮的功能:

JSON.parse(json, symbolize_name: true)

carvr3hs

carvr3hs2#

它看起来像一个格式问题。例如,如果你有一个普通的散列与相同的数据,并将其转换为JSON,它会看起来有点不同:

require 'json'
# Original value in post
# json = "{:status=>\"ok\", :hitcount=>\"1\", :request_date=>Wed, 10 Oct 2019 00:00:00 +0000}"

hash = {:status=>"ok", :hitcount=>"1", :request_date=>"Wed, 10 Oct 2019 00:00:00 +0000"}
json = hash.to_json
puts json  # {"status":"ok","hitcount":"1","request_date":"Wed, 10 Oct 2019 00:00:00 +0000"}

parsed = JSON.parse(json)
puts parsed  # {"status"=>"ok", "hitcount"=>"1", "request_date"=>"Wed, 10 Oct 2019 00:00:00 +0000"}

字符串
你可以在这里看到我的意思:https://onlinegdb.com/tr6JVAV6y
所以我猜你需要看看JSON是从哪里来的,并以适当的格式发送。

gfttwv5a

gfttwv5a3#

您可以使用eval()将此字符串转换为ruby代码(哈希)。你会得到一些问题,因为日期没有引用。(我只是让ChatGPT为它编写Regex)。这将把你的字符串转换成一个正确的ruby哈希:

json = "{:status=>\"ok\", :hitcount=>\"1\", :request_date=>Wed, 10 Oct 2019 00:00:00 +0000}" 

fixed_string = json.gsub(/:request_date=>(\w+,\s\d+\s\w+\s\d+\s\d+:\d+:\d+\s\+\d+)/, ':request_date=>"\1"')

hash = eval(fixed_string)

字符串
输出量:

{:status=>"ok", :hitcount=>"1", :request_date=>"Wed, 10 Oct 2019 00:00:00 +0000"}


请注意,如果您无法控制输入,那么使用eval会带来安全风险,问题似乎是如何生成输出。

相关问题