我试图使用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
Run Code Online (Sandbox Code Playgroud)
以上工作,它会查询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}
]
}
Run Code Online (Sandbox Code Playgroud)
当我使用它们时,我收到此错误:
new.rb:10: syntax error, unexpected ':', expecting tASSOC
"format":'json',
Run Code Online (Sandbox Code Playgroud)
我想知道为什么会这样?红宝石不喜欢用":"哈希吗?我问的原因是在foo_3上我有一个json文件我希望放入格式如下:
[{"id":"abc123","first":1.8, "second": 2.8},
{"id":"abc456","first":-1.5, "second": 1.2}]
Run Code Online (Sandbox Code Playgroud)
因此,当我尝试使用它时,也得到:
new.rb:10: syntax error, unexpected ':', expecting tASSOC
Run Code Online (Sandbox Code Playgroud)
大概有2000个id - 所以我不能全部改变:to =>手动,这也是动态的.所以我有点卡住了!
因此,在发送数组之前,我必须找到一种方法将所有":"更改为"=>",或者我正在做一些愚蠢而非常错误的事情.
谢谢
这是Ruby 1.9的新哈希语法.这两种形式是相同的
{foo: 1, bar: 2}
{:foo => 1, :bar => 2}
Run Code Online (Sandbox Code Playgroud)
格式化为JSON后,符号成为字符串,所以
{foo: 1, bar: 2}.to_json
{:foo => 1, :bar => 2}.to_json
{"foo" => 1, "bar" => 2}.to_json
Run Code Online (Sandbox Code Playgroud)
都产生相同的输出.
简介:不要将哈希值更改为新语法.它运作得很好.
我刚刚重新阅读了您的问题并注意到您提到了要插入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}
Run Code Online (Sandbox Code Playgroud)
从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}
Run Code Online (Sandbox Code Playgroud)
但是,不要评估它.如果它是JSON字符串,请使用JSON.parse它.
| 归档时间: |
|
| 查看次数: |
1599 次 |
| 最近记录: |