Ruby Hash不工作API - 冒号

时间:2012-03-15 11:11:48

标签: ruby

我正在尝试使用Ruby通过JSON / REST查询api。

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',

我想知道为什么会这样?红宝石不喜欢用“:”哈希吗?我问的原因是在foo_3上我有一个json文件,我希望放入格式为:

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

因此,当我尝试使用它时,也会得到:

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

大约有2000个id - 所以我不能改变所有:to =>手动,这也将是动态的。所以我有点卡住了!

所以要么我必须找到一种方法将所有“:”改为“=>”在我发送数组之前,或者我做了一些愚蠢而非常错误的事情。

由于

3 个答案:

答案 0 :(得分:5)

这是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

都产生相同的输出。

摘要:不要费心将哈希值更改为新语法。它运作得很好。

更新

我刚刚重新阅读了您的问题并注意到您提到了要插入ruby哈希的“JSON文件”。我不知道你使用的代码是什么,但它不会飞。 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字符串和简单的eval它。

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 :(得分:1)

我认为它来自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}]

答案 2 :(得分:0)

我认为你没事。 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}]}
>>