如何在Ruby中解析字符串的字符串?

时间:2014-06-14 05:24:09

标签: ruby

我正在使用返回" JSON字符串" ...的API,这意味着它返回的文字用双引号括起来:

response = HTTParty.get('http://api.example.com')
response.body == '"token"'

对于我的所有请求,我正在抽象API请求并自动使用JSON.parse(response.body),但在这种情况下,它会阻塞字符串,因为它不是JSON对象。

我想我可以添加一个额外的逻辑分支来检查它是否是一个字符串,不要解析为JSON。我该如何从字符串中提取字符串?

3 个答案:

答案 0 :(得分:1)

使用正则表达式

s = '"token"'
str = s[/\A"(.+)"\Z/, 1]
puts str # => token

答案 1 :(得分:1)

尝试:

JSON.parse(response.body) rescue response.body[1..-2]

答案 2 :(得分:1)

为什么不嗅探用于定义对象的普通JSON打开/关闭字符[ ... ]{ ... }

以下是对象看起来如何转换为JSON:

require 'json'

puts JSON[{'foo' => 1}]
puts JSON[[1, 2]]
# >> {"foo":1}
# >> [1,2]

检查以确保它们是有效的字符串表示形式:

JSON['{"foo":1}'] # => {"foo"=>1}
JSON['[1,2]'] # => [1, 2]

以下是我如何编写一些代码来嗅探传入的字符串是否看起来像一个有效的JSON字符串,或者只是一个包含双引号的字符串:

require 'json'

def get_object(str)
  if str[/^[{\[].+[}\]]$/]
    JSON[str]
  else
    str[1..-2]
  end
end

get_object('{"foo":1}') # => {"foo"=>1}
get_object('{"foo":1}').class # => Hash
get_object('[1,2]') # => [1, 2]
get_object('[1,2]').class # => Array
get_object("'bar'") # => "bar"

请注意,在最后一行中,用单引号括起来的字符串'bar'作为一个裸字符串返回,即没有单引号的包装集,因此不再引用该字符串。 / p>

您可能会收到一个带有空白字符串或跟随有效负载的字符串。如果是这样,请执行以下操作:

def get_object(str)
  if str.strip[/^[{\[].+[}\]]$/]
    JSON[str]
  else
    str.strip[1..-2]
  end
end

get_object('  {"foo":1}') # => {"foo"=>1}
get_object('  [1,2]  ') # => [1, 2]
get_object(" 'bar'") # => "bar"