我正在尝试使用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 =>手动,这也将是动态的。所以我有点卡住了!
所以要么我必须找到一种方法将所有“:”改为“=>”在我发送数组之前,或者我做了一些愚蠢而非常错误的事情。
由于
答案 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}
从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}]}
>>