我正在学习Ruby。
我有一些代码使用HTTParty库来下载一些数据。远程服务器未正确定义内容类型,因此不会自动解析响应(作为JSON)。
JSON看起来像这样:
{"response":{ ............ }}
在代码中有以下行:
if resp['response'] == 'response'
如果自动解析响应,则其行为与预期相同,并且将返回原始JSON中的{ .......... }
。在未解析的情况下,它返回字符串response
,我无法弄清楚为什么会这样做。
HTTParty库的哪个功能导致它返回字符串response
?
在尝试访问['response']
时,导致纯文本数据的不同请求返回Nil。
答案 0 :(得分:1)
这就是我现在理解的方式。 resp['response']
尝试在resp对象上调用[]
方法,但由于未定义,因此调用method_missing
方法
# the method_missing from HTTParty::Response
def method_missing(name, *args, &block)
if parsed_response.respond_to?(name)
$stdout.puts parsed_response.class.inspect
$stdout.puts parsed_response.inspect
parsed_response.send(name, *args, &block)
elsif response.respond_to?(name)
response.send(name, *args, &block)
else
super
end
end
在未解析JSON的情况下,parsed_response
实际上是一个字符串。 Ruby中的String类定义[]
,这样当给出类似response
的字符串作为参数时,返回相同的字符串,但仅在它存在于整个字符串中的情况下。
由于JSON字符串确实包含"response"
,因此返回了response
值。