Ruby Hash не работает API - Colon - PullRequest
3 голосов
/ 15 марта 2012

Я пытаюсь запросить API через JSON / REST, используя Ruby.

require 'rubygems'
require 'rest-client'
require 'json'


###Request Build#####
url = 'http://site_name'
request ={
     "format"=>'json',
     "foo"=> {"first"=>1.1,"second"=>2.2},
     "foo_1"=>300,
     "foo_2"=>"speed",
     "foo_3"=>[
         {"id"=> "abc123", "first"=> 1.8, "second"=> 2.8},
         {"id"=> "abc456", "first"=> -1.5, "second"=> 1.2}
         ]
}.to_json

### go go go ###
response = RestClient.post(url,request, :content_type => :json, :accept => :json)
puts response

Выше работает, он будет запрашивать API просто отлично.Однако в документации API, которую я использую, говорится, что у меня должно быть «:» вместо «=>», например

     "format":'json',
     "foo":{"first":1.1,"second":2.2},
     "foo_1":300,
     "foo_2":"speed",
     "foo_3":[
         {"id":"abc123", "first":1.8, "second":2.8},
         {"id":"abc456", "first":-1.5, "second":1.2}
         ]
}

, когда я их использую, я получаю эту ошибку:

new.rb:10: syntax error, unexpected ':', expecting tASSOC
     "format":'json',

Мне было интересно, почему это было?Разве ruby ​​не любит хэши с ":"?Причина, по которой я спрашиваю, состоит в том, что на foo_3 у меня есть файл json, который я хотел бы вставить, который отформатирован следующим образом:

     [{"id":"abc123","first":1.8, "second": 2.8},
     {"id":"abc456","first":-1.5, "second": 1.2}]

Поэтому, когда я пытаюсь использовать его, также получаю:

Существует около 2000 идентификаторов - поэтому я не могу изменить все: на => вручную, и это будет динамично.Так что я немного застрял!

ТАК Либо я должен найти способ изменить все ":" на "=>" перед отправкой массива, либо я делаю что-то глупое и очень неправильное.

Спасибо

Ответы [ 3 ]

5 голосов
/ 15 марта 2012

Это новый синтаксис хэша из Ruby 1.9.Эти две формы идентичны

{foo: 1, bar: 2}
{:foo => 1, :bar => 2}

После форматирования в JSON символы становятся строками, поэтому

{foo: 1, bar: 2}.to_json
{:foo => 1, :bar => 2}.to_json
{"foo" => 1, "bar" => 2}.to_json

все выдают одинаковый вывод.

Резюме: непотрудитесь изменить ваши хэши на новый синтаксис.Он работает просто отлично.

Обновление

Я только что перечитал ваш вопрос и заметил, что вы упомянули "JSON-файл", который вы хотите вставить в хэш ruby.Я не знаю, какой код вы используете для этого, но он не сработает.Для спецификации JSON требуются имена ключей в кавычках, а синтаксис хэшей Ruby (оба) не JSON-совместим.Так что вы не можете просто взять JSON и притвориться, что это хэш Ruby.Вы можете разобрать его, однако.

require 'json'

json_string = "{\"id\":\"abc123\",\"first\":1.8, \"second\": 2.8}"
ruby_hash = JSON.parse json_string
# {"id"=>"abc123", "first"=>1.8, "second"=>2.8}

Обновление 2

Начиная с ruby ​​2.2, существует третий вариант синтаксиса хеширования, который совместим с json.Таким образом, вы можете взять строку json и просто оценить ее.

json_string = '{"id":"abc123","first":1.8, "second": 2.8}'
eval(json_string) # => {:id=>"abc123", :first=>1.8, :second=>2.8}

Не оценивайте ее, хотя.Если это строка JSON, используйте JSON.parse.

1 голос
/ 15 марта 2012

Я думаю, что это из Ruby 1.9 версии (не уверен), но в любом случае синтаксис должен быть следующим,

 > [{id: "abc123",first: 1.8, second: 2.8},{id: "abc456", first: -1.5, second: 1.2}]
 => [{:id=>"abc123", :first=>1.8, :second=>2.8}, {:id=>"abc456", :first=>-1.5, :second=>1.2}]
0 голосов
/ 15 марта 2012

Я думаю, вы поняли это правильно. to_json метод позаботится о форматировании для вас.

>> require 'json'
=> true
>> request ={
?>                   "format"=>'json',
?>                   "foo"=> {"first"=>1.1,"second"=>2.2},
?>                   "foo_1"=>300,
?>                   "foo_2"=>"speed",
?>                   "foo_3"=>[
?>                         {"id"=> "abc123", "first"=> 1.8, "second"=> 2.8},
?>                         {"id"=> "abc456", "first"=> -1.5, "second"=> 1.2}
>>                       ]
>>   }.to_json
=> {"format":"json","foo":{"first":1.1,"second":2.2},"foo_1":300,"foo_2":"speed","foo_3":[{"id":"abc123","first":1.8,"second":2.8},{"id":"abc456","first":-1.5,"second":1.2}]}
>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...