Преобразование строки JSON в объект JSON в Rails

#ruby-on-rails #json

Вопрос:

Я получаю строку JSON от контроллера Rails и передаю ее работнику; однако, когда она попадает к работнику, она преобразуется в строку, которую я затем пытаюсь преобразовать обратно в JSON. Когда я это делаю, я получаю ошибки.

Ниже приведен пример того, что я пытаюсь сделать, а также ошибка, полученная при попытке сделать это:

 [18] pry(#<SampleWorker>)> str = '{"id"=>"F02DD5GH77X", "created"=>1630584313, "timestamp"=>1630584313}'
=> "{"id"=>"F02DD5GH77X", "created"=>1630584313, "timestamp"=>1630584313}"
[19] pry(#<SampleWorker>)> JSON.parse(str)
JSON::ParserError: 809: unexpected token at '{"id"=>"F02DD5GH77X", "created"=>1630584313, "timestamp"=>1630584313}'
from /usr/local/lib/ruby/3.0.0/json/common.rb:216:in `parse'
[20] pry(#<SampleWorker>)> JSON(str)
JSON::ParserError: 809: unexpected token at '{"id"=>"F02DD5GH77X", "created"=>1630584313, "timestamp"=>1630584313}'
from /usr/local/lib/ruby/3.0.0/json/common.rb:216:in `parse'
[21] pry(#<SampleWorker>)> 
 

Я даже пытался заменить " его, и это, похоже, не помогает:

 [26] pry(#<SampleWorker>)> str.gsub(""", "'")
=> "{'id'=>'F02DD5GH77X', 'created'=>1630584313, 'timestamp'=>1630584313}"
[27] pry(#<SampleWorker>)> JSON.parse(str.gsub(""", "'"))
JSON::ParserError: 809: unexpected token at '{'id'=>'F02DD5GH77X', 'created'=>1630584313, 'timestamp'=>1630584313}'
from /usr/local/lib/ruby/3.0.0/json/common.rb:216:in `parse'
[28] pry(#<SampleWorker>)> 
 

Комментарии:

1. Вы не получите JSON обратно от SampleWorker. Вы получаете результат Hash#to_s . { "foo" => 'bar' }.to_s дает "{"foo"=>"bar"}" . Находится ли SampleWorker под вашим контролем?

Ответ №1:

Вам нужно заменить => на :

 str = str.gsub("=>", ":")
# => "{"id":"F02DD5GH77X", "created":1630584313, "timestamp":1630584313}"

JSON.parse(str)
# => {"id"=>"F02DD5GH77X", "created"=>1630584313, "timestamp"=>1630584313}