2014-06-14 93 views
0

我與返回一個「JSON字符串」的API ...這意味着它的包裝用雙引號返回文本工作:如何在Ruby中解析字符串的字符串?

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

對於所有我的請求,我抽象的API請求自動使用JSON.parse(response.body),但在這種情況下,由於它不是JSON對象,所以會在字符串上扼流。

我想我可以添加一個額外的邏輯分支來檢查它是否是一個字符串,不要解析爲JSON。我應該如何從這個字符串中提取字符串?

+1

'response.body [1 ..- 2]'? – Fabricator

回答

1

使用正則表達式

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

嘗試:

JSON.parse(response.body) rescue response.body[1..-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'作爲裸字符串返回,即沒有包裝單引號集,因此字符串不再被引用。

您可能會收到一個空白字符串或跟隨有效載荷的字符串。如果是,請執行如下操作:

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"