2

我有以下在 bash 中有效的内容:

curl -d "{ \"auth_token\": \"secret\", \"current\":"${COUNT}"}" http://lab:3030/widgets/connections

但是,如果我在 Ruby 中尝试这样做会失败:

`curl -d "{\"auth_token\":\"secret\",\"current\":"#{count}"}" http://lab:3030/widgets/connections`

并得到这个错误信息:

JSON::ParserError - 746: unexpected token at '{auth_token:secret,current:4}':

Ruby 的输出在屏幕上看起来是正确的,但会触发 JSON 解析器错误。我还能检查什么?

我正在考虑使用像遏制福这样的宝石,但无法弄清楚如何构建它以使其看起来与上面的 bash 相同。

谢谢。

4

2 回答 2

4

您可以使用stdlib'sjson来转换哈希:

require 'json'

{foo: "bar"}.to_json
#=> "{\"foo\":\"bar\"}"

shellwords构建命令:

require 'shellwords'

['curl', '-d', '{"foo":"bar"}', 'http://example.com/'].shelljoin
#=> "curl -d \\{\\\"foo\\\":\\\"bar\\\"\\} http://example.com/"

完整示例:

require 'json'
require 'shellwords'

data = {auth_token: secret, current: count}
`#{['curl', '-d', data.to_json, 'http://lab:3030/widgets/connections'].shelljoin}`
于 2013-07-29T09:36:57.193 回答
2

看起来你有一个转义问题:在 Ruby 版本中引号没有被正确转义。尝试这个:

`curl -d "{\\"auth_token\\":\\"secret\\",\\"current\\":"#{count}"}" http://lab:3030/widgets/connections`

这是因为 Ruby 和 shell 都使用反斜杠转义,所以转义发生了两次。通过添加额外的反斜杠,Ruby 版本被转义为,\"而不是只是"然后 shell 可以为您转义引号。

于 2013-07-29T08:37:38.460 回答