我已经搜索了我能找到的,但似乎没有找到我需要的答案。当然,我可能措词不正确。我尝试使用.find
或什至.rindex
来倒数,但没有这种运气。我从JSON收到的值看起来像这样:
"AdditionalData":"<Data><Entry Key=\"utm_campaign\" Value=\"j2c\" />
<Entry Key=\"utm_medium\" Value=\"cpc\" /><Entry Key=\"utm_source\"
Value=\"j2c\" /><Entry Key=\"job_id\" Value=\"300_xxxx_10703\" /></Data>"
我需要能够获取键“ job_id”的值,因此必须是“ 300_xxxx_11233”。此值将更改JSON响应返回的每个对象。任何帮助将不胜感激,请让我知道它是否已经存在,而我只是错过了。
答案 0 :(得分:3)
如果每个请求的响应格式都相同,则即使不解析JSON,也可以使用普通的regexp表达式来获取数据。示例:
response = "<Data><Entry Key=\"utm_campaign\" Value=\"j2c\" /><Entry Key=\"utm_medium\" Value=\"cpc\" /><Entry Key=\"utm_source\" Value=\"j2c\" /><Entry Key=\"job_id\" Value=\"300_xxxx_10703\" /></Data>"
match = response.match(%r{job_id\\?"\s+Value=\\?"(.+)\\?"}i)
match[1] if match # => "300_xxxx_10703"
如果响应格式可以更改(例如,如果Entry
元素的属性顺序可以更改),则您需要解析JSON并使用一些HTML解析器,例如Nokigiri,来获取所需的属性。代码示例:
parsed_response = JSON.parse(response)
doc = Nokogiri::HTML(parsed_response['AdditionalData'])
job_id = nil
doc.css('Entry').each do |el|
if el['Key'] == 'job_id'
job_id = el['Value']
break
end
end